Python 使用线程时Pyqt5 GUI仍然挂起
我不熟悉python和pyqt。 我正在学习如何使用GUI线程 我遵循了这个教程 我将for循环更改为无限while循环(增加“I”) 如果我执行程序,GUI仍然挂起,但是如果我删除循环中的发射信号,它就不再挂起Python 使用线程时Pyqt5 GUI仍然挂起,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我不熟悉python和pyqt。 我正在学习如何使用GUI线程 我遵循了这个教程 我将for循环更改为无限while循环(增加“I”) 如果我执行程序,GUI仍然挂起,但是如果我删除循环中的发射信号,它就不再挂起 是否有一些技巧可以让它不挂起?我认为你在两件事上被否决了: 您只复制并粘贴了教程中的代码 你没有读教程 在本教程中,作者指出: 在上面的示例中,我们创建了QPushbutton和QTextEdit。单击该按钮时,它将创建一个从0到9计数的新线程,并发出信号,以便在QTextEdit中
是否有一些技巧可以让它不挂起?我认为你在两件事上被否决了:
而为true
,可以继续发出信号并将文本附加到QTextEdit中。可能不是你想要的。
另外,在内部注释
emit
语句将继续运行while循环。while True
将在后台执行无休止的循环
从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
导入系统
导入线程
从上次导入时
类通信(QObject):
信号=pyqtSignal(int,str)
类My_Gui(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.comm=Communicate()
self.comm.signal.connect(self.append_数据)
self.initUI()
def initUI(self):
btn_count=QPushButton('count')
btn\u计数。单击。连接(自启动\u计数)
self.te=QTextEdit()
vbox=QVBoxLayout()
vbox.addWidget(btn_计数)
vbox.addWidget(self.te)
self.setLayout(vbox)
self.setWindowTitle('PyQT5'中的多线程)
self.setGeometry(400400400400)
self.show()
def计数(自身、通信):
对于范围(10)内的i:
data=“data”+str(一)
通信信号发射(i,数据)
#而下面的True将永远不会停止并导致程序卡住
'''
i=0
尽管如此:
data=“data”+str(一)
通信信号发射(i,数据)
i+=1
'''
def开始计数(自身):
my_Thread=threading.Thread(target=self.count,args=(self.comm,))
my_Thread.start()
def附加_数据(self、num、data):
self.te.append(str(num)+“”+数据)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
my_gui=my_gui()
sys.exit(app.exec_())
请解释我的问题出了什么问题,不要投反对票。是因为我的问题太基本了吗?嗨,我读了教程,已经理解了,但我不知道为什么它挂起了。我没有复制所有的代码,我修改了循环代码。在Java中,可以使用invokeLater从后台线程更新UI,我认为“emit”在python中是等效的。使用相同的逻辑在Java中测试线程,我只想知道为什么它挂起在python中。“发射”是否有一些限制?或者这个例子是错误的?这就是我问的原因。对于Java和Python/PyQt,更新GUI的工作方式不同。请看这里:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
import threading
from _ast import While
class Communicate(QObject):
signal = pyqtSignal(int, str)
class My_Gui(QWidget):
def __init__(self):
super().__init__()
self.comm = Communicate()
self.comm.signal.connect(self.append_data)
self.initUI()
def initUI(self):
btn_count = QPushButton('Count')
btn_count.clicked.connect(self.start_counting)
self.te = QTextEdit()
vbox = QVBoxLayout()
vbox.addWidget(btn_count)
vbox.addWidget(self.te)
self.setLayout(vbox)
self.setWindowTitle('MultiThreading in PyQT5')
self.setGeometry(400, 400, 400, 400)
self.show()
def count(self, comm):
'''
for i in range(10):
data = "Data "+str(i)
comm.signal.emit(i, data)
'''
i = 0
while True:
data = "Data "+str(i)
comm.signal.emit(i, data)
i+=1
def start_counting(self):
my_Thread = threading.Thread(target=self.count, args=(self.comm,))
my_Thread.start()
def append_data(self, num, data):
self.te.append(str(num) + " " + data)
if __name__ == '__main__':
app = QApplication(sys.argv)
my_gui = My_Gui()
sys.exit(app.exec_())