当前位置: 首页 > article >正文

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

一、图像显示

1.1、增加图标

1.直接创建setWindowIcon(QIcon('灯泡.jpg'))

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtGui import QIconclass 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, QPixmapclass 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, QPixmapclass 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, QtWidgetsclass 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.translateForm.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=0def 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+=1def 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 += 1if __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,QPaletteclass 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)  # 确保不超过100self.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 = indeximage_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_())

 

相关文章:

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

一、图像显示 1.1、增加图标 1.直接创建setWindowIcon(QIcon(灯泡.jpg)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init_…...

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月…...

普通用户授权docker使用权限

1、检查docker用户组 sudo cat /etc/group |grep docker 若显示&#xff1a;docker:x:999: # 表示存在否则创建docker用户组&#xff1a; sudo groupadd docker2、查看 /var/run/docker.sock 的属性 ll /var/run/docker.sock 显示&#xff1a; srw-rw---- 1 root root 0 1月…...

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

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

Java集合List详解(带脑图)

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

后盾人JS -- 异步编程,宏任务与微任务

异步加载图片体验JS任务操作 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…...

Go语言的内存分配原理

Go语言的内存分配原理 Go语言的内存管理分为两个主要区域&#xff1a;栈&#xff08;Stack&#xff09; 和 堆&#xff08;Heap&#xff09;。理解这两个区域的工作原理&#xff0c;可以帮助你写出更高效的代码&#xff0c;并避免一些常见的性能问题。 1. 栈&#xff08;Stac…...

分层解耦-ioc引入

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

【知识科普】CPU,GPN,NPU知识普及

CPU,GPU,NPU CPU、GPU、NPU 详解1. CPU&#xff08;中央处理器&#xff09;2. GPU&#xff08;图形处理器&#xff09;3. NPU&#xff08;神经网络处理器&#xff09; **三者的核心区别****协同工作示例****总结** CPU、GPU、NPU 详解 1. CPU&#xff08;中央处理器&#xff0…...

【管理与实物】1.1.1 建筑物分类与构成

1.1.1 建筑物分类与构成 建筑物的分类建筑物的构成 一、课前学习建议 民用建筑的分类&#xff1a;根据《民用建筑设计统一标准》GB50352-2019 划分可划分为单层或多层民用建筑、高层民用建筑、超高层民用建筑&#xff1b;根据《建筑设计防火规范》GB50016-2014&#xff08;2…...

CentOS虚机在线扩容系统盘数据盘

最近在制作Openstack下的镜像&#xff0c;用户需要CentOS6以及CentOS7的虚机镜像&#xff0c;遇到了些关于系统盘以及数据盘在线扩容的问题&#xff0c;故此整理一下。 ​ 传统我们想对磁盘在线热扩容&#xff0c;必然会想到LVM逻辑卷。如果没有LVM逻辑卷的情况下&#xff0c;…...

使用Kickstart配置文件封装操作系统实现Linux的自动化安装

使用Kickstart配置文件封装操作系统实现Linux的自动化安装 创建ks.cfg配置文件 可以使用已经安装完成的Linux操作系统中的/root目录下的anaconda.cfg配置文件 注意&#xff0c;配置文件会因为kickstart的版本兼容性的问题导致无法安装报错需要在实际使用过程中删除某些参数 …...

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

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

【20250211】栈与队列:1047.删除字符串中的所有相邻重复项

#方法一&#xff1a;使用栈 # class Solution: # def removeDuplicates(self, s): # res [] # for char in s: # #真和消消乐一样&#xff0c;栈外来一个数据&#xff0c;如果和栈顶数据相同&#xff0c;则不仅不入栈&#xff0c;还把栈顶数据…...

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…...

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…...

【时时三省】(C语言基础)什么是算法

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一个程序主要包括以下两方面的信息&#xff1a; &#xff08;1&#xff09;对数据的描述。在程序中&#xff0c;要指定用到哪些数据&#xff0c;以及这些数据的类型和数据组织形式。这就是数…...

Spring Boot 中加载多个 YAML 配置文件

在 Spring Boot 中加载多个 YAML 配置文件是一个常见的需求&#xff0c;通常用于将配置信息分离到多个文件中以便于管理和维护。Spring Boot 提供了灵活的方式来加载多个 YAML 配置文件。 以下是一些方法和步骤&#xff0c;用于在 Spring Boot 应用中加载多个 YAML 配置文件&a…...

IPoIB模块初始化过程详解

在现代网络环境中,InfiniBand over IP (IPoIB) 作为一种高性能的网络技术,被广泛应用于数据中心和高性能计算领域。为了确保其稳定性和高效性,Linux内核中的IPoIB模块在加载时需要进行一系列复杂的初始化操作。本文将基于一系列技术对话内容,详细介绍IPoIB模块的初始化流程…...

C语言——排序(冒泡,选择,插入)

基本概念 排序是对数据进行处理的常见操作&#xff0c;即将数据按某字段规律排列。字段是数据节点的一个属性&#xff0c;比如学生信息中的学号、分数等&#xff0c;可针对这些字段进行排序。同时&#xff0c;排序算法有稳定性之分&#xff0c;若两个待排序字段一致的数据在排序…...

如何本地部署DeepSeek

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

Docker 部署 MySQL-5.7 单机版

一、镜像获取 # docker hub 镜像 docker pull farerboy/mysql:5.7 # 国内阿里镜像 docker pull registry.cn-hangzhou.aliyuncs.com/farerboy/mysql:5.7 以上两个镜像二选一即可 二、运行容器 docker run -dti --name mysql \n --privileged \n --cgroupns private \n --e…...

正则表达式--元字符-限定符(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;不受网络用户的物理位置…...

C++17 新特性解析

C++17 是 C++ 标准的一个重要更新,它在 C++11/14 的基础上引入了许多新特性,进一步简化了代码编写、提升了性能和类型安全性。以下是 C++17 的主要特性分类介绍: 一、语言核心改进 1. 结构化绑定(Structured Bindings) 允许将元组、结构体或数组的成员直接解包到变量中。…...

泛化、选择、分化

泛化是指记忆联系的“发散”&#xff0c;泛化兴奋的基础是模糊兴奋。记忆联系的“发散”有以下几种种情况&#xff1a; 1、联络区的一原始记忆柱群&#xff08;A1&#xff09;具有直接或间接与其它任意联络区的任意原始记忆柱群建立记忆联系的潜力。也就是说任何两个对象&…...

网络安全架构师怎么考 网络安全 架构

安全通信网络 随着现代技术的不断发展&#xff0c;等级保护对象通常通过网络实现资源共享和数据交互&#xff0c;当大量的设备连成网络后&#xff0c;网络安全成了最为关注的问题。按照“一个中心&#xff0c;三重防御”的纵深防御思想&#xff0c;边界外部通过广域网或城域网…...