PyQt线程问题

在pyqt5中我们通常需要在子线程中处理耗时操作如网络请求,在主线程中更新UI界面,下面是一个简单的例子,运行界面如下

在这里插入图片描述

# -*- coding: utf-8 -*-


import sys

from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtGui import QIcon, QCloseEvent
from PyQt5.QtWidgets import *

class MyThread(QThread):
    # 定义一个传输 int类型的信号
    send_singal = pyqtSignal(int)
    def run(self):
        for i in range(1, 5):
            print("current id is: ", self.currentThreadId())
            self.send_singal.emit(i)
            QThread.sleep(1)

class Window(QWidget):
    def __init__(self,*args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        # 设置宽高
        self.resize(600, 400)
        # 窗口移动到指定位置
        self.move(660,300)
        # 设置标题
        self.setWindowTitle("标哥测试")
        # 设置logo
        # self.setWindowIcon(QIcon("logo.png"))
        # 初始化UI界面的控件
        self.setUI()
        # 初始化事件
        self.intilogic()


    def setUI(self):
        self.layout = QVBoxLayout()
        self.progress = QProgressBar()
        self.progress.setRange(0, 100)
        print(self.progress.width())
        self.button = QPushButton("点击开始线程")
        self.button.clicked.connect(self.start)
        self.layout.addWidget(self.progress)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)
    def intilogic(self):
    	# 创建子线程并和当前窗口绑定 
        self.thread = MyThread(self)
        # 完成循环后删除子线程
        self.thread.finished.connect(self.thread.deleteLater)
        self.thread.send_singal.connect(self.change_value)
        self.button.clicked.connect(self.start)

    def change_value(self, value):
    # 设置进度条
        self.progress.setValue(value)

    def start(self):
        print('当前主线程ID: ', int(QThread.currentThreadId()))
        # 线程开启后再次点击是没有用的,也不会再次重新开始线程
        # 但是当线程运行完毕之后,由于上面调用了
        # self.thread.deleteLater 所以 在子线程运行完毕之后再次点击运行这段代码会报错,需要处理
        try:
            self.thread.start()
        except:
            print("子线程开启失败")
    # 窗口的关闭事件        
    def closeEvent(self, a0: QCloseEvent):
        print("关闭")
        super(Window, self).closeEvent(a0)



if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

posted @   飞航之梦  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示