一、图像显示
1.1、增加图标
1.直接创建setWindowIcon(QIcon('灯泡.jpg'))
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtGui import QIcon
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
# 设置主窗口图标
self.setWindowIcon(QIcon('灯泡.jpg'))
self.setWindowTitle("QIcon 示例")
self.setGeometry(300, 300, 400, 300)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
2. 通过pixmap 加载
icon=QIcon()
icon.addPixmap(QPixmap('灯泡.jpg'),QIcon.Normal,QIcon.Off)
QIcon()
: 创建一个新的QIcon
对象。
addPixmap
: 该方法将一个 pixmap(图像)添加到图标。传递的参数包括:
QPixmap('灯泡.jpg')
: 将名为 '灯泡.jpg' 的图像作为 pixmap 加载。
QIcon.Normal
: 指定图标的状态为“正常”。
QIcon.Off
: 指定图标的模式为“关闭”。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtGui import QIcon, QPixmap
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
icon=QIcon()
icon.addPixmap(QPixmap('灯泡.jpg'),QIcon.Normal,QIcon.Off)
self.setWindowIcon(icon)
self.setWindowTitle("图片显示")
self.setGeometry(300, 300, 400, 300)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
3.按钮图标
button = QPushButton('点击我', self)
button.setIcon(QIcon(QPixmap('灯泡.jpg')))
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtGui import QIcon, QPixmap
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
# 设置主窗口图标
self.setWindowIcon(QIcon('灯泡.jpg'))
# 创建一个按钮并设置图标
button = QPushButton('点击我', self)
button.setIcon(QIcon(QPixmap('灯泡.jpg')))
button.setGeometry(100, 100, 200, 50)
self.setWindowTitle("QIcon 示例")
self.setGeometry(300, 300, 400, 300)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
1.2、静态图片显示
self.label_light.setPixmap(QPixmap('灯泡.jpg').scaled(self.label_light.size()))
self.label_light: 这是一个 QLabel 的实例,假设在某个类(例如窗口类)中定义。
setPixmap(): 此方法用于设置 QLabel 中显示的图像。
QPixmap('灯泡.jpg'): 创建一个 QPixmap 对象,用于加载 灯泡.jpg 图像。
scaled(self.label_light.size()): 将图像缩放到与 label_light 大小相同。self.label_light.size() 返回标签的当前大小。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'pict.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(597, 440)
self.label_fan = QtWidgets.QLabel(Form)
self.label_fan.setGeometry(QtCore.QRect(320, 190, 261, 241))
self.label_fan.setText("")
self.label_fan.setObjectName("label_fan")
self.label_light = QtWidgets.QLabel(Form)
self.label_light.setGeometry(QtCore.QRect(0, 190, 261, 241))
self.label_light.setText("")
self.label_light.setObjectName("label_light")
self.btn_light = QtWidgets.QPushButton(Form)
self.btn_light.setGeometry(QtCore.QRect(50, 60, 81, 61))
self.btn_light.setObjectName("btn_light")
self.btn_fan = QtWidgets.QPushButton(Form)
self.btn_fan.setGeometry(QtCore.QRect(420, 60, 91, 61))
self.btn_fan.setObjectName("btn_fan")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "图片显示"))
self.btn_light.setText(_translate("Form", "开灯"))
self.btn_fan.setText(_translate("Form", "动态图"))
1.3、动态图片显示
movie=QMovie()
创建了一个 QMovie 对象,默认是一个空的动画。
movie.setFileName('6259.gif_wh860.gif')
使用 setFileName 方法,将 GIF 动画文件的路径赋值给 QMovie 对象。
self.label_fan.setScaledContents(True)
将 QLabel 的 scaledContents 属性设置为 True,这意味着 QLabel 中的内容(即 GIF 动画)将根据 QLabel 的大小进行缩放。
self.label_fan.setMovie(movie)
将之前配置好的 QMovie 对象设置到 QLabel 上,使其能够展示动画。
movie.start()
调用
start()
方法开始播放 GIF 动画。
from PyQt5.QtWidgets import QWidget,QPushButton,QTextBrowser,QLabel,QTextEdit,QApplication
import sys
from PyQt5.QtGui import QIcon, QPixmap, QMovie
from pict import *
class Pict(QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
icon=QIcon()
icon.addPixmap(QPixmap('灯泡.jpg'),QIcon.Normal,QIcon.Off)
self.setWindowIcon(icon)
self.slot_init()
def slot_init(self):
self.btn_light.clicked.connect(self.show_fight)
self.btn_fan.clicked.connect(self.show_fan)
def show_fight(self):
self.label_light.setPixmap(QPixmap('灯泡.jpg').scaled(self.label_light.size()))
def show_fan(self):
movie=QMovie()
movie.setFileName('6259.gif_wh860.gif')
self.label_fan.setScaledContents(True)
self.label_fan.setMovie(movie)
movie.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
windows = Pict()
windows.show()
# app.exec()
sys.exit(app.exec_())
1.4、按钮操作开关灯
from PyQt5.QtWidgets import QWidget,QPushButton,QTextBrowser,QLabel,QTextEdit,QApplication
import sys
from PyQt5.QtGui import QIcon, QPixmap, QMovie
from pict import *
class Pict(QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
icon=QIcon()
icon.addPixmap(QPixmap('灯泡.jpg'),QIcon.Normal,QIcon.Off)
self.setWindowIcon(icon)
self.slot_init()
self.count=0
def slot_init(self):
self.btn_light.clicked.connect(self.show_fight)
self.btn_fan.clicked.connect(self.show_fan)
def show_fight(self):
if self.count%2==0:
self.btn_light.setText('开灯')
self.label_light.setPixmap(QPixmap('开灯.png').scaled(self.label_light.size()))
else:
self.btn_light.setText('关灯')
self.label_light.setPixmap(QPixmap('关灯.png').scaled(self.label_light.size()))
self.count+=1
def show_fan(self):
if self.count % 2 == 0:
# self.btn_fan.setStyleSheet("border-image:url(绿色.png)")
self.btn_fan.setStyleSheet(None)
movie=QMovie()
movie.setFileName('6259.gif_wh860.gif')
self.label_fan.setScaledContents(True)
self.label_fan.setMovie(movie)
movie.start()
else:
self.btn_fan.setStyleSheet("border-image:url(背景.png)")
self.label_fan.setPixmap(QPixmap('6259.gif_wh860.gif').scaled(self.label_fan.size()))
self.count += 1
if __name__ == '__main__':
app = QApplication(sys.argv)
windows = Pict()
windows.show()
# app.exec()
sys.exit(app.exec_())
1.5、按钮背景
1.6、界面背景
self.palette=QPalette()
创建了一个
QPalette
对象,QPalette
是用于设置窗口部件颜色和样式的类。
self.palette.setBrush(QPalette.Background,QBrush(QPixmap('490de2494101804d89f2cc746357062.png').scaled(self.size())))
QPalette.Background:指定要设置背景的角色。
QBrush:用于填充的画刷,使用
QBrush
来定义如何填充背景。QPixmap:加载指定的图像文件,并用
scaled(self.size())
方法将其缩放至当前窗口的大小。
self.setPalette(self.palette)
将配置好的调色板应用到当前窗口或部件,使其背景图像生效。
from PyQt5.QtWidgets import QWidget,QPushButton,QTextBrowser,QLabel,QTextEdit,QApplication
import sys
from PyQt5.QtGui import QIcon, QPixmap, QMovie,QBrush,QPalette
class Widge(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('背景')
self.btn=QPushButton("按钮",self)
self.btn.setGeometry(100,20,100,30)
self.btn.setStyleSheet("border-image:url(背景.png)")
self.palette=QPalette()
self.palette.setBrush(QPalette.Background,QBrush(QPixmap('490de2494101804d89f2cc746357062.png').scaled(self.size())))
self.setPalette(self.palette)
if __name__ == '__main__':
app = QApplication(sys.argv)
windows = Widge()
windows.show()
# app.exec()
sys.exit(app.exec_())
二、定时器
2.1、实时显示系统时间
借助QLabel显示系统时间
实时: 引入QTimer定时器 要使用定时器:
超时时间设置、定时器启动、定时器 信号 系统时间获取: QDateTime类的使用
self.timer = QTimer(self) self.timer.setInterval(1000) self.timer.timeout.connect(self.update_time) self.timer.start()
- self.timer = QTimer(self):创建一个
QTimer
实例,以当前窗口作为父部件,防止定时器在窗口关闭时继续运行。- self.timer.setInterval(1000):设置定时器的时间间隔为 1000 毫秒(1 秒)。
- self.timer.timeout.connect(self.update_time):将定时器的超时信号(即每次到达设定的间隔时)连接到
update_time
方法,以便当计时器到期时该方法被调用。- self.timer.start():启动定时器,使其开始计时。
def update_time(self): self.current_time = QDateTime.currentDateTime().toString("hh:mm:ss") self.show_time.setText(self.current_time)
- self.current_time = QDateTime.currentDateTime().toString("hh:mm:ss"):获取当前的日期和时间并将其格式化为 "hh:mm:ss" 的字符串。
- self.show_time.setText(self.current_time):将当前时间字符串设置为
show_time
标签的文本,更新标签内容以显示新的时间。
# 导入必要的模块
from PyQt5.QtGui import QFont # 导入 QFont 用于设置字体
from PyQt5.QtWidgets import QLabel, QWidget, QApplication # 导入窗口部件
from PyQt5.QtCore import QTime, QTimer, QDateTime # 导入时间和定时器相关的类
import sys # 导入 sys 模块以处理命令行参数
# 创建主窗口类,继承 QWidget
class windows(QWidget):
def __init__(self):
super().__init__() # 调用父类的构造函数
self.ui_init() # 初始化用户界面
def ui_init(self):
# 设置窗口标题
self.setWindowTitle('定时器')
# 设置窗口的几何属性:位置和大小 (x, y, width, height)
self.setGeometry(500, 500, 520, 550)
# 创建 QLabel 用于显示时间,初始文本为 '定时器'
self.show_time = QLabel('定时器', self)
# 设置标签的字体为 Arial,大小为 25
self.show_time.setFont(QFont('Arial', 25))
# 设置标签的位置和大小 (x, y, width, height)
self.show_time.setGeometry(60, 30, 600, 300)
# 创建 QTimer 实例,父部件为当前窗口
self.timer = QTimer(self)
# 设置定时器的时间间隔为 1000 毫秒(1 秒)
self.timer.setInterval(1000)
# 连接定时器的超时信号到 update_time 方法
self.timer.timeout.connect(self.update_time)
# 启动定时器
self.timer.start()
def update_time(self):
# 获取当前日期和时间,格式化为 "hh:mm:ss" 字符串
self.current_time = QDateTime.currentDateTime().toString("hh:mm:ss")
# 将当前时间更新到 QLabel 中显示
self.show_time.setText(self.current_time)
# 程序入口
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建 QApplication 实例,传入命令行参数
windows = windows() # 创建主窗口实例
windows.show() # 显示窗口
# app.exec() # 这行代码被注释掉了,因为下面的 sys.exit(app.exec_()) 会执行事件循环
sys.exit(app.exec_()) # 启动应用程序的事件循环,直到窗口关闭
2.2、 倒计时实现
借助QLCDNumber类显示,它提供了一个液晶显示屏(LCD)数字显示部件,可以 用display()方法来显示数字。
每一秒都要更新: 引入QTimer定时器 超时时间设置、定时器启动、定时器信号
倒计时: 需要有计数值, 每一秒数值都要-1, 然后要转成时间的格式显示, 引入 QTime类 将数值类型转成时间格式
def ui_init(self): self.count = 5 # 初始化倒计时的秒数为 5 秒 self.time = QTime(0, 0, 0) # 创建 QTime 对象,初始为 00:00:00 self.star_time = self.time.addSecs(self.count).toString("hh:mm:ss") # 计算倒计时结束时的时间字符串
设置倒计时
self.count = 5
:设置倒计时的初始值为 5 秒。self.time = QTime(0, 0, 0)
:创建一个QTime
对象,表示 00:00:00。self.star_time = self.time.addSecs(self.count).toString("hh:mm:ss")
:计算出倒计时结束时的时间,并将其格式化为字符串。
self.show_lcd = QLCDNumber(self) # 创建 QLCDNumber 用于显示倒计时 self.show_lcd.setDigitCount(8) # 设置显示的数字位数 self.show_lcd.display(self.star_time) # 显示初始时间 self.show_lcd.setGeometry(100, 30, 200, 30) # 设置显示区域的位置和大小 self.btn = QPushButton('开始倒计时', self) # 创建按钮,初始文本为 '开始倒计时' self.btn.setGeometry(120, 80, 160, 30) # 设置按钮的位置和大小 self.btn.clicked.connect(self.star_timeeee) # 连接按钮点击事件到处理方法
创建 LCD 显示器:
self.show_lcd = QLCDNumber(self)
:创建一个QLCDNumber
实例,用于显示倒计时。self.show_lcd.setDigitCount(8)
:设置 LCD 显示的数字位数为 8。self.show_lcd.display(self.star_time)
:在 LCD 显示器上显示初始时间。self.show_lcd.setGeometry(100, 30, 200, 30)
:设置 LCD 显示器的位置和大小。创建按钮:
self.btn = QPushButton('开始倒计时', self)
:创建一个按钮,初始文本为“开始倒计时”。self.btn.setGeometry(120, 80, 160, 30)
:设置按钮的位置和大小。self.btn.clicked.connect(self.star_timeeee)
:将按钮的点击事件连接到star_timeeee
方法,以便在按钮被点击时执行该方法。
self.timer = QTimer(self) # 创建 QTimer 实例 self.timer.setInterval(1000) # 设置定时器每 1000 毫秒(1 秒)触发一次 self.timer.timeout.connect(self.upate_time) # 连接定时器超时事件到更新时间的方法
创建定时器:
self.timer = QTimer(self)
:创建一个QTimer
实例,父部件为当前窗口。self.timer.setInterval(1000)
:设置定时器的时间间隔为 1000 毫秒(1 秒)。self.timer.timeout.connect(self.upate_time)
:将定时器的超时信号连接到upate_time
方法,以便当计时器到期时该方法被调用。
def star_timeeee(self): if self.btn.text() == '开始倒计时': self.timer.start() # 启动定时器 self.btn.setText('暂停') # 将按钮文本改为 "暂停" elif self.btn.text() == '暂停': self.timer.stop() # 停止定时器 self.btn.setText('开始倒计时') # 将按钮文本改为 "开始倒计时"
按钮处理方法:
def star_timeeee(self):
:定义按钮点击后的处理方法。if self.btn.text() == '开始倒计时':
:检查按钮当前文本,如果是“开始倒计时”则启动定时器。self.timer.start()
:启动定时器。self.btn.setText('暂停')
:将按钮文本更改为“暂停”。elif self.btn.text() == '暂停':
:如果按钮文本是“暂停”,则停止定时器。self.timer.stop()
:停止定时器。self.btn.setText('开始倒计时')
:将按钮文本更改为“开始倒计时”。
def upate_time(self): self.count -= 1 # 倒计时减一秒 if self.count < 0: # 如果倒计时小于 0 QMessageBox.warning(self, "倒计时", '比赛结束') # 弹出警告框提示比赛结束 self.timer.stop() # 停止定时器 self.btn.setText('开始倒计时') # 将按钮文本改为 "开始倒计时" else: # 更新显示的时间 self.current_time = self.time.addSecs(self.count).toString("hh:mm:ss") # 计算当前剩余时间 self.show_lcd.display(self.current_time) # 更新 LCD 显示
更新时间的方法:
def upate_time(self):
:定义更新时间的方法。self.count -= 1
:每次调用该方法时将倒计时减一秒。if self.count < 0:
:检查倒计时是否小于 0。
QMessageBox.warning(self, "倒计时", '比赛结束')
:如果倒计时结束,弹出警告框提示“比赛结束”。self.timer.stop()
:停止定时器。self.btn.setText('开始倒计时')
:将按钮文本更改为“开始倒计时”。else:
:如果倒计时仍大于或等于 0。
self.current_time = self.time.addSecs(self.count).toString("hh:mm:ss")
:计算当前剩余的时间并格式化为字符串。self.show_lcd.display(self.current_time)
:在 LCD 显示器上更新显示的时间。
# 导入必要的模块
from PyQt5.QtGui import QFont # 导入 QFont 用于设置字体
from PyQt5.QtWidgets import QLabel, QWidget, QApplication, QPushButton, QLCDNumber, QMessageBox # 导入窗口部件
import sys # 导入 sys 模块以处理命令行参数
from PyQt5.QtCore import QTimer, QDateTime, QTime # 导入时间和定时器相关的类
# 创建主窗口类,继承 QWidget
class windows(QWidget):
def __init__(self):
super().__init__() # 调用父类的构造函数
self.ui_init() # 初始化用户界面
def ui_init(self):
# 初始化计时器的倒计时秒数
self.count = 5 # 倒计时初始值为 5 秒
# 创建 QTime 对象,初始为 00:00:00
self.time = QTime(0, 0, 0)
# 计算倒计时结束时的时间字符串
self.star_time = self.time.addSecs(self.count).toString("hh:mm:ss")
# 创建 QLCDNumber 用于显示倒计时
self.show_lcd = QLCDNumber(self)
self.show_lcd.setDigitCount(8) # 设置显示的数字位数
self.show_lcd.display(self.star_time) # 显示初始时间
self.show_lcd.setGeometry(100, 30, 200, 30) # 设置显示区域的位置和大小
# 创建开始/暂停按钮
self.btn = QPushButton('开始倒计时', self)
self.btn.setGeometry(120, 80, 160, 30) # 设置按钮的位置和大小
self.btn.clicked.connect(self.star_timeeee) # 连接按钮点击事件到处理方法
# 创建 QTimer 实例
self.timer = QTimer(self)
self.timer.setInterval(1000) # 设置定时器每 1000 毫秒(1 秒)触发一次
self.timer.timeout.connect(self.upate_time) # 连接定时器超时事件到更新时间的方法
def star_timeeee(self):
# 开始或暂停倒计时的处理方法
if self.btn.text() == '开始倒计时': # 如果按钮文本为 "开始倒计时"
self.timer.start() # 启动定时器
self.btn.setText('暂停') # 将按钮文本改为 "暂停"
elif self.btn.text() == '暂停': # 如果按钮文本为 "暂停"
self.timer.stop() # 停止定时器
self.btn.setText('开始倒计时') # 将按钮文本改为 "开始倒计时"
def upate_time(self):
# 更新时间的方法
self.count -= 1 # 倒计时减一秒
if self.count < 0: # 如果倒计时小于 0
QMessageBox.warning(self, "倒计时", '比赛结束') # 弹出警告框提示比赛结束
self.timer.stop() # 停止定时器
self.btn.setText('开始倒计时') # 将按钮文本改为 "开始倒计时"
else:
# 更新显示的时间
self.current_time = self.time.addSecs(self.count).toString("hh:mm:ss") # 计算当前剩余时间
self.show_lcd.display(self.current_time) # 更新 LCD 显示
# 程序入口
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建 QApplication 实例,传入命令行参数
windows = windows() # 创建主窗口实例
windows.show() # 显示窗口
# app.exec() # 这行代码被注释掉了,因为下面的 sys.exit(app.exec_()) 会执行事件循环
sys.exit(app.exec_()) # 启动应用程序的事件循环,直到窗口关闭
三、进度条
进度条QProgressBar使用时需要那些值: 取值的范围、值的修改、当前值的获取
按钮QPushButton,对话框QMessageBox,进度条QProgressBar
def slot_init(self): self.btn.clicked.connect(self.star_timer) self.timer=QTimer(self) self.timer.setInterval(1000) self.timer.timeout.connect(self.update_value)
初始化信号和槽
slot_init
方法:
self.btn.clicked.connect(self.star_timer)
: 将按钮的clicked
信号连接到self.star_timer
槽函数。 当按钮被点击时,star_timer
方法会被调用。self.timer=QTimer(self)
: 创建一个QTimer
实例,并将其父控件设置为self
。self.timer.setInterval(1000)
: 设置定时器的时间间隔为 1000 毫秒 (1 秒)。self.timer.timeout.connect(self.update_value)
: 将定时器的timeout
信号连接到self.update_value
槽函数。 当定时器超时(每隔 1 秒),update_value
方法会被调用。
def star_timer(self): if self.btn.text() == '开始下载': self.timer.start() self.btn.setText('暂停下载') print('开始下载,定时器开始') else: self.timer.stop() self.btn.setText('开始下载') print('定时器关闭,暂停下载')
star_timer
方法:
if self.btn.text() == '开始下载'
: 检查按钮的文本是否为 "开始下载"。
- 如果是,则调用
self.timer.start()
启动定时器。- 将按钮的文本更改为 "暂停下载"。
- 打印 "开始下载,定时器开始" 到控制台。
else
: 如果按钮的文本不是 "开始下载"(即为 "暂停下载")。
- 调用
self.timer.stop()
停止定时器。- 将按钮的文本更改回 "开始下载"。
- 打印 "定时器关闭,暂停下载" 到控制台。
def update_value(self): self.random_num=random.randint(0,10) print(f'随机生成的值{self.random_num}') self.cur_num=self.progress_bar.value() print(f'当前的值{self.cur_num}') self.update_num=self.random_num+self.cur_num print(f'更新的值{self.update_num}') if self.update_num+self.random_num>=100: self.progress_bar.setValue(100) self.timer.stop() QMessageBox.information(self,'资源下载','下载完成') else: self.progress_bar.setValue(self.update_num)
update_value
方法:
self.random_num=random.randint(0,10)
: 生成一个 0 到 10 之间的随机整数,模拟每次更新的进度量。self.cur_num=self.progress_bar.value()
: 获取当前进度条的值。self.update_num=self.random_num+self.cur_num
: 计算新的进度值。if self.update_num+self.random_num>=100
: 检查更新后的值是否大于等于 100。
- 如果是,则将进度条的值设置为 100。
- 停止定时器。
- 使用
QMessageBox.information
显示一个消息框,提示 "下载完成"。else
: 如果更新后的值小于 100。
- 将进度条的值设置为
self.update_num
。
import random # 导入随机数模块,用于模拟下载进度的随机性
from PyQt5.QtCore import QTimer # 导入定时器类
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QProgressBar # 导入PyQt5的GUI组件
import sys # 导入系统模块,用于退出程序
class MyQwidget(QWidget): # 创建一个自定义的窗口类,继承自QWidget
def __init__(self):
super().__init__() # 调用父类的构造函数
self.ui_init() # 初始化用户界面
self.slot_init() # 初始化信号和槽函数
def ui_init(self):
self.setWindowTitle('进度条') # 设置窗口标题
self.setGeometry(600, 300, 1200, 600) # 设置窗口的位置和大小
self.progress_bar = QProgressBar(self) # 创建一个进度条控件,父控件为当前窗口
self.progress_bar.setGeometry(100, 200, 1000, 100) # 设置进度条的位置和大小
self.progress_bar.setRange(0, 100) # 设置进度条的范围,最小值为0,最大值为100
self.progress_bar.setValue(0) # 设置进度条的初始值为0
self.btn = QPushButton('开始下载', self) # 创建一个按钮控件,文本为“开始下载”,父控件为当前窗口
self.btn.setGeometry(475, 400, 150, 100) # 设置按钮的位置和大小
def slot_init(self):
self.btn.clicked.connect(self.star_timer) # 将按钮的点击信号连接到star_timer槽函数
self.timer = QTimer(self) # 创建一个定时器对象,父对象为当前窗口
self.timer.setInterval(1000) # 设置定时器的时间间隔为1000毫秒(1秒)
self.timer.timeout.connect(self.update_value) # 将定时器的超时信号连接到update_value槽函数
def star_timer(self):
if self.btn.text() == '开始下载': # 如果按钮的文本是“开始下载”
self.timer.start() # 启动定时器
self.btn.setText('暂停下载') # 将按钮的文本设置为“暂停下载”
print('开始下载,定时器开始') # 在控制台输出信息
else: # 如果按钮的文本不是“开始下载”
self.timer.stop() # 停止定时器
self.btn.setText('开始下载') # 将按钮的文本设置为“开始下载”
print('定时器关闭,暂停下载') # 在控制台输出信息
def update_value(self):
self.random_num = random.randint(0, 10) # 生成一个0到10之间的随机整数
print(f'随机生成的值{self.random_num}') # 在控制台输出随机生成的值
self.cur_num = self.progress_bar.value() # 获取当前进度条的值
print(f'当前的值{self.cur_num}') # 在控制台输出当前进度条的值
self.update_num = self.random_num + self.cur_num # 计算更新后的进度值
print(f'更新的值{self.update_num}') # 在控制台输出更新后的进度值
if self.update_num + self.random_num >= 100: # 如果更新后的进度值大于等于100
self.progress_bar.setValue(100) # 将进度条的值设置为100
self.timer.stop() # 停止定时器
QMessageBox.information(self, '资源下载', '下载完成') # 显示一个消息框,提示下载完成
else: # 如果更新后的进度值小于100
self.progress_bar.setValue(self.update_num) # 将进度条的值设置为更新后的进度值
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建一个QApplication对象
w = MyQwidget() # 创建一个MyQwidget对象,即主窗口
w.show() # 显示主窗口
sys.exit(app.exec_()) # 启动应用程序的事件循环
根据进度条显示图片
import sys
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QMessageBox,
QProgressBar, QLabel, QVBoxLayout)
class ImageProgressBar(QWidget):
"""
一个带有进度条和图片显示的窗口。
"""
def __init__(self):
super().__init__()
self.image_paths = [f'{i}.png' for i in range(9)] # 图片路径列表
self.current_image_index = 0 # 当前显示的图片索引
self.setWindowTitle('根据进度条显示图片')
self.setGeometry(600, 300, 400, 400)
self.init_ui()
self.init_slots()
self.timer.start(1000) # 启动定时器, 避免一开始不点击按钮, 图片不出现
def init_ui(self):
"""
初始化用户界面。
"""
# 创建控件
self.progress_bar = QProgressBar(self)
self.progress_bar.setRange(0, 100)
self.progress_bar.setValue(0)
self.btn = QPushButton('开始加载', self)
self.label = QLabel(self)
self.label.setFixedSize(200, 200) # 固定大小,避免图片缩放问题
self.label.setScaledContents(True) # 自适应label大小
# 布局管理
layout = QVBoxLayout(self) # 垂直布局
layout.addWidget(self.label)
layout.addWidget(self.progress_bar)
layout.addWidget(self.btn)
self.setLayout(layout)
self.update_image() # 初始化图片
def init_slots(self):
"""
初始化信号和槽。
"""
self.btn.clicked.connect(self.toggle_timer)
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_value)
def toggle_timer(self):
"""
切换定时器状态(开始/停止)。
"""
if self.timer.isActive():
self.timer.stop()
self.btn.setText('开始加载')
print('定时器关闭,暂停加载')
else:
self.timer.start()
self.btn.setText('暂停加载')
print('开始加载,定时器开始')
def update_value(self):
"""
更新进度条和图片。
"""
current_value = self.progress_bar.value()
new_value = min(current_value + 12, 100) # 确保不超过100
self.progress_bar.setValue(new_value)
self.update_image() # 更新图片
print(f'更新的值{new_value}')
if new_value == 100:
self.timer.stop()
QMessageBox.information(self, '资源加载', '加载完成')
def update_image(self):
"""
根据进度条的值更新显示的图片。
"""
progress = self.progress_bar.value()
index = min(progress // 12, 8) # 计算图片索引
if index != self.current_image_index:
self.current_image_index = index
image_path = self.image_paths[index]
self.label.setPixmap(QPixmap(image_path))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ImageProgressBar()
window.show()
sys.exit(app.exec_())