Python----PyQt开发(PyQt高级:图像显示,定时器,进度条)

news2025/2/12 13:40:11

一、图像显示

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_())

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

2025.2.10 每日学习记录3:技术报告只差相关工作+补实验

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右&#xff0c;一次性备考笔试的三个科目 1.实习申请技术准备&#xff1a;微调、Agent、RAG 据央视财经&#xff0c;数据显示&#xff0c;截至2024年12月…

微生物学术语和定义 | 微生物学词汇表

​ 微生物学作为一门研究微生物及其与环境、宿主和其他生物相互作用的科学&#xff0c;涵盖了广泛的学科领域和专业术语。然而&#xff0c;由于微生物学的快速发展和跨学科融合&#xff0c;许多术语的定义和使用在不同领域中可能存在差异甚至混淆。 随着新冠疫情的全球蔓延&am…

Java集合List详解(带脑图)

允许重复元素&#xff0c;有序。常见的实现类有 ArrayList、LinkedList、Vector。 ArrayList ArrayList 是在 Java 编程中常用的集合类之一&#xff0c;它提供了便捷的数组操作&#xff0c;并在动态性、灵活性和性能方面取得了平衡。如果需要频繁在中间插入和删除元素&#xf…

分层解耦-ioc引入

内聚: 软件中各个功能模块内部的功能联系。 耦合: 衡量软件中各个层/模块之间的依赖、关联的程度。 软件设计原则: 高内聚低耦合。

如何利用DeepSeek开源模型打造OA系统专属AI助手

利用DeepSeek开源模型打造OA系统专属AI助手&#xff0c;可以显著提升办公效率&#xff0c;增强信息检索和管理能力。 注册与登录DeepSeek平台 访问DeepSeek官网 访问DeepSeek的官方网站DeepSeek。使用电子邮件或手机号码注册账号并登录。 获取API Key 登录DeepSeek平台&am…

uni getLocation 公众号h5获取定位坐标没有返回

先看代码 //获取经纬度getLocation() {console.log("111")uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; res.latitude);},fail: function(err) {conso…

C语言基本概念————讨论sqrt()和pow()函数与整数的关系

本文来源&#xff1a;C语言基本概念——讨论sqrt()和pow()函数与整数的关系. C语言基本概念——sqrt和pow函数与整数的关系 1. 使用sqrt()是否可以得到完全平方数的精确的整数平方根1.1 完全平方数的计算结果是否精确&#xff1f;1.2 为什么不会出现误差&#xff08;如 1.99999…

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…

正则表达式--元字符-限定符(4)

正则的限定元字符 表示前边一个符号代表的内容出现多少次 1.* ------ 表示0~正无穷次 2. ------ 表示 1~正无穷次 3. ? ------ 表示 0~1次 4. {n} ------ 表示 限定 n 次, 不能多也不能少 5. {n,} ------ 表示 最少 n 次 6. {n,m} ------ 表示 最少 n 次, 最多 m 次 <!DO…

【CMAEL多智能体框架】第一节 环境搭建及简单应用(构建一个鲜花选购智能体)

第一节 环境搭建 文章目录 第一节 环境搭建前言一、安装二、获取API1. 使用熟悉的API代理平台2.设置不使用明文存放API 三 、具体应用进阶任务 总结 前言 CAMEL Multi-Agent是一个开源的、灵活的框架&#xff0c;它提供了一套完整的工具和库&#xff0c;用于构建和模拟多智能体…

网络工程师 (31)VLAN

前言 VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是一种将物理局域网划分成多个逻辑上独立的虚拟网络的技术。 一、定义与特点 定义&#xff1a;VLAN是对连接到的第二层交换机端口的网络用户的逻辑分段&#xff0c;不受网络用户的物理位置…

玩转适配器模式

文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…

腾讯云大数据套件TBDS与阿里云大数据能力产品对比

前言 博主在接触大数据方向研究的时候是在2016年,那时候正是大数据概念非常火热的一个时间段,最著名的Google的3篇论文。Google FS、MapReduce、BigTable,奠定了大数据框架产品的基础。Google文件系统,计算框架和存储框架。往后所有的大数据产品和过程域无一不是在三个模块…

Codeforces Round 1003 (Div. 4)(A~G题题解)

A. Skibidus and Amogu 思路&#xff1a;把字符串最后的us变成i就可以了&#xff0c;水题一个 #include <iostream> #include <string> int main() { int t; std::cin >> t; std::cin.ignore(); while (t--) { std::string W; std::getline(std::c…

ubuntu使用防火墙开放和关闭指定端口

防火墙可以阻止或允许外部对特定端口的访问&#xff0c;Ubuntu 常用的防火墙管理工具是 ufw&#xff08;Uncomplicated Firewall&#xff09; &#xff0c;如果在开发网络通信相关的内容时&#xff0c;要确保所需的端口是打开的&#xff0c;这样可以排除出题出现时的一个问题—…

mysql8.0使用PXC实现高可用

1.什么是 PXC PXC 是一套 MySQL 高可用集群解决方案&#xff0c;与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题&#xff0c;基本上可以达到实时同步。而且节点与节点之间&#xff0c;他们相互的关系是对等的。PXC 最关注的是数据…

大数据学习之SparkStreaming、PB级百战出行网约车项目一

一.SparkStreaming 163.SparkStreaming概述 Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, fault-tolerant stream processing of live data streams. Spark Streaming 是核心 Spark API 的扩展&#xff0c;支持实时数据…

Ollama部署DeepSeek(windows or ubuntu)

Ollama(官网是https://ollama.com/)是一个专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计的开源框架。它简化了大型语言模型的部署过程&#xff0c;提供了轻量级与可扩展的架构&#xff0c;使得研究人员、开发人员和爱好者能够更加方便地在本地…

10.代码生成器-树表

1.导入部门表 2.配置生成信息页面 生成代码即可使用。