Pyqt5实现新线程更新窗口UI

这篇具有很好参考价值的文章主要介绍了Pyqt5实现新线程更新窗口UI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Pyqt5实现线程内更新窗口UI

我们用pyqt5开发窗口应用时,应用会执行一些耗时的操作,如复制大量文件,下载大量数据等。一般情况下,在这些操作没有完成时,窗口的UI处于“假死”状态,不会更新,只有所有操作完成后,窗口的状态才会更新。这样对用户使用非常不友好。
使用多线程技术,在新线程内进行那些耗时的操作,同时根据操作进度向主线程返回操作进度,根据进度更新窗口UI,可以实现更好的用户体验。

下面是用一个简单的例子说明实现过程。

一、程序界面:

程序界面如下:
pyqt5线程刷新ui数据,python,qt,ui,开发语言,python

本例中,窗口有一个按钮和一个多行文本框。点击按钮后开启新线程,进行耗时操作。在点击后修改按钮的状态为不可用,可以防止用户重复点击,新线程将完成进度返回给主线程,根据完成进度,更新文本框的内容用于显示完成进度。待操作全部完成后,新线程返回“全部完成”,主线程恢复按钮的状态为可用。

二、实现代码:

'''
code writing:hnkkfan
本例用于演示Pyqt5 在线程中更新UI控件
窗口中使用一个多行文本框QTextEdit,用于显示更新的处理线程进度
一个按钮QPushButton,点击开始后开始在新线程中处理耗时比较长的工作
为防止重复操作,在点击按钮后的处理过程中,按钮的状态变为不可用,
处理完成后,恢复状态为可用。
'''

from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,pyqtSignal)
import sys
import time
from PyQt5.QtWidgets import QTextEdit, QHBoxLayout, QVBoxLayout


class Thread_do(QThread):  # 定义线程类
    _signal =pyqtSignal(str)#定义带参数一个信号
    def __init__(self):
        super().__init__()

    def run(self):#线程的执行方法
        for i in range(20):
            retInfo=f"开始处理第{i+1}个..."
            time.sleep(0.5)#这个用休眠0.5秒代替我们需要执行的耗进代码
            retInfo+="处理完成"
            self._signal.emit(retInfo)#返回进度
        self._signal.emit("全部完成")#循环结束后返回全部完成

class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.txt_PressInfo = QTextEdit()  # 定义一个处理信息文本框
        self.btn_do = QPushButton('开始处理', self)#定义一个按钮
        self.btn_do.clicked.connect(self.btn_click)  # 绑定槽函数
        #定义两个水平布局,用于放置文本框和按钮
        hbox_line1 = QHBoxLayout()
        hbox_line1.addWidget(self.txt_PressInfo)
        hbox_line2 = QHBoxLayout()
        hbox_line2.addWidget(self.btn_do)
        #定义一个垂直布局用于放置两个水平布局
        vbox = QVBoxLayout()
        vbox.addLayout(hbox_line1)
        vbox.addLayout(hbox_line2)  # 添加上面的水平布局器

        self.setLayout(vbox)  # 把垂直布局器添加到窗口
    def btn_click(self):#按钮的点击事件
        #点击后让按钮不可用,防止重复点击,并改变按钮文本为正在处理...
        self.btn_do.setEnabled(False)
        self.btn_do.setText("正在处理...")
        #定义线程实例
        self.thread_do = Thread_do()
        # 信号连接,如果收到信号,就执行对应的函数
        self.thread_do._signal.connect(self.set_btn_resig)
        #启动线程实例
        self.thread_do.start()

    #定义收到信号的处理方法
    def set_btn_resig(self,_info):
        if _info=="全部完成":#如果返回值为全部完成则恢复按钮的状态和文本
            self.btn_do.setEnabled(True)
            self.btn_do.setText("开始处理")
        else:#否则在文本框中显示进度
            self.txt_PressInfo.append(_info)



if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.setWindowTitle("多线程更新UI演示")
    myshow.setMinimumHeight(480)
    myshow.setMinimumWidth(640)
    myshow.show()
    sys.exit(app.exec_())

三、运行效果:

点击后,按钮不可用,并修改按钮文本为“正在处理…”。同时新线程不断向主线程返回进度,并更新文本框中的进度信息。
pyqt5线程刷新ui数据,python,qt,ui,开发语言,python

全部操作执行完毕后,新线程向主线程返回“全部完成”,主线程收到信息后,将按钮状态变为可用,并将按钮的文本改回“开始处理”
pyqt5线程刷新ui数据,python,qt,ui,开发语言,python文章来源地址https://www.toymoban.com/news/detail-637946.html

到了这里,关于Pyqt5实现新线程更新窗口UI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python使用PyQt5实现指定窗口置顶

    工作中,同事随口提了一句:要是能让WPS窗口置顶就好了,老是将窗口切换来切换去的太麻烦了。 然后,这个奇怪的点子引起了本人的注意,那就试试能不能实现吧。 不知道是不是我手法或版本的缘故,用了网上找的代码都是窗口弹出而已,并没有把它置顶,可以参考以下

    2024年02月13日
    浏览(39)
  • 【Python】Pyqt5 主窗口调用子窗口demo

    背景: 通过主窗口的按钮调用其对应的窗口,代码比较简单,直接看,不懂的欢迎留言; 一共两个代码: ui_first.py :实现的是主窗口 ui_second.py:实现的是子窗口 点击开始按钮调用子窗口,点击关闭退出窗口; ui_first.py ui_second.py

    2024年02月11日
    浏览(29)
  • python GUI工具之PyQt5模块,pyCharm 配置PyQt5可视化窗口

    https://doc.qt.io/qt-5/qtwidgets-module.html https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum 一、简介 PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件。 PyQt5是由一系列Python模块组成,有超过6

    2024年02月11日
    浏览(40)
  • pyqt5窗口图标和背景的设置方法

    pyqt5窗口图标和背景的设置方法 一、PyQt5设置窗口图标的方法: 1.导入PyQt5.QtGui下的QIcon模块        from PyQt5.QtGui import QIcon 2.添加窗口的WindowIcon属性        Form.setWindowIcon(QIcon(\\\'./imge/azc.ico\\\')) 二、PyQt5设置窗口背景的方法: 第一种方法:使用窗口的StyleSheet属性方法(注意选择

    2024年02月04日
    浏览(34)
  • PyQt5:窗口大小根据屏幕大小自适应调整

     

    2024年02月12日
    浏览(41)
  • pyqt5设置标题栏三个按钮以及窗口大小

    组件也会受影响,范围0-1,0是全透明,1是不透明

    2024年02月13日
    浏览(37)
  • PyQt5 框架搭建+实战(多窗口打开,文件对话框)

    1.Qt设计师界面创建主窗口 2.转化成py文件 3.建立一个主窗口类,继承Qwidget和Qt设计师生成的UI类 4.写一个main函数入口,创建app,创建主窗口类实例,show(), app.exec() 我们不要在Qt设计师生成的界面上去增加我们的代码,因为这个界面我们一直都需要修改,修改后生成新的py代码

    2024年02月02日
    浏览(48)
  • 在PyQt5窗口中嵌入open3d窗口显示点云图形

     本文方法来自:PYQT5内嵌外部exe程序(win7)_pyqt5嵌入外部窗口_这杯可乐有点甜的博客-CSDN博客 open3d在绘制点云等图形时,通常需要创建一个窗口。本文实现了将open3d创建的窗口显示在Qt窗口内,以便于后续通过Qt控件和槽函数调用open3d强大的绘图和处理功能。 运行结果如下

    2024年02月06日
    浏览(148)
  • 【pyqt5界面化工具开发-8】窗口开发-QDialog对话框

    目录 一、调用父类的菜单 二、添加更多的布局在对话框内 和前面Qwedget一样的结构(不做过多介绍) 可以参考代码中的注释 这和前面讲的Qwedget窗口布局基本上一样了 运行结果:

    2024年02月11日
    浏览(35)
  • pyqt5, 如何在窗口上显示10个点地循环进度条。

    要在PyQt5窗口上显示从1个点逐渐增加到10个点,然后周而复始地循环,可以使用PyQt5的图形绘制功能和定时器来实现。以下是一个简单的例子: import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QColor, QBrush from PyQt5.QtCore import Qt, QTimer class PointDisplay(QWidget

    2024年02月14日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包