在做GUI界面时我们希望后台任务能够与UI分开,在PyQt中,主线程用来重绘界面。而子线程里边的实时处理结果需要反馈到界面,子线程里边不能执行界面更新操作。
wxpython多线程刷新界面转到
下面给出类Python3+PyQt5多线程防假死动态刷新界面的模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
from PyQt5 import QtWidgets, QtCore import sys from PyQt5.QtCore import * import time # 继承QThread class Runthread(QtCore.QThread): # 通过类成员对象定义信号对象 _signal = pyqtSignal(str) def __init__(self): super(Runthread, self).__init__() def __del__(self): self.wait() def run(self): for i in range(100): time.sleep(0.2) self._signal.emit(str(i)) # 注意这里与_signal = pyqtSignal(str)中的类型相同 class Example(QtWidgets.QWidget): def __init__(self): super().__init__() # 按钮初始化 self.button = QtWidgets.QPushButton('开始', self) self.button.setToolTip('这是一个 <b>QPushButton</b> widget') self.button.resize(self.button.sizeHint()) self.button.move(120, 80) self.button.clicked.connect(self.start_login) # 绑定多线程触发事件 # 进度条设置 self.pbar = QtWidgets.QProgressBar(self) self.pbar.setGeometry(50, 50, 210, 25) self.pbar.setValue(0) # 窗口初始化 self.setGeometry(300, 300, 300, 200) self.setWindowTitle('OmegaXYZ.com') self.show() self.thread = None # 初始化线程 def start_login(self): # 创建线程 self.thread = Runthread() # 连接信号 self.thread._signal.connect(self.call_backlog) # 进程连接回传到GUI的事件 # 开始线程 self.thread.start() def call_backlog(self, msg): self.pbar.setValue(int(msg)) # 将线程的参数传入进度条 if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) myshow = Example() myshow.show() sys.exit(app.exec_()) |
注意下面的可以放多个参数,不止可以放一个str。
1 |
_signal = pyqtSignal(str) |
注意import方式,如果不是
1 |
from PyQt5.QtCore import * |
得在pyqtSignal前加上相应的上层
您好,
我的程序是这样的 主界面点击按钮 然后进行爬虫 爬虫结束后弹出另一界面 显示数据
一开始爬虫的时候 主界面会显示未响应 然后弄了多线程 可以了 可是我的数据显示界面弹不出来
显示错误:QObject::setParent: Cannot set parent, new parent is in a different thread
请问这个问题该如何解决 谢谢~
代码如下:class MyMain(QWidget,Ui_movsys):
def __init__(self,parent = None):
super(MyMain,self).__init__(parent)
self.setupUi(self)
self.btn1.clicked.connect(self.get_info)
# self.btn2.clicked.connect(self.pri)
self.btn3.clicked.connect(self.piaofang)
# self.btn4.clicked.connect(self.rank)
# self.btn5.clicked.connect(self.pri)
def get_info(self):
self.thread= RunThread()
self.thread.start()
class Info(QWidget,Ui_Info):
def __init__(self):
super(Info,self).__init__()
self.setupUi(self)
class RunThread(QThread):
trigger = pyqtSignal()
def __init__(self,parent = None):
super(RunThread,self).__init__(parent)
def __del__(self):
self.wait()
def run(self):
txt = main.txt_movie.toPlainText()
info(txt)
info_show = Info()
btn_ok = QMessageBox.information(main, “提醒”, “数据获取完毕”, QMessageBox.Ok)
if btn_ok == QMessageBox.Ok:
info_show.show()#到这里 界面出不来
self.trigger.emit()
你的父类不在同一个线程里面。
您好,方便请教一个问题吗?
我用pyqt做了一个监控界面,主界面分两个窗口,左边是常规视频播放,右边是隔一段时间读取摄像头图片进行目标检测后的结果显示,我把常规摄像头播放进了Qthead里运行,但是我右边进行检测的时候左边会出现播放卡死,等计算完成后才能恢复,这种问题要怎么解决呢?
感谢~
两边的都要开个thread,所有功能建议全部多线程。
好的,谢谢,我试试,这里还有个多线程的问题,多个线程无法给予公平的执行时间,cpu时间分配会倾向于更加耗资源的线程,这样会不会导致常规播放卡顿呢?python有没有办法控制这个呢?
这个不太清楚,可以看看进程优先级和抢占。
好的。感谢!