【发布时间】:2015-11-28 07:56:22
【问题描述】:
我正在用 PyQT5 制作一个轻量级的 GUI 程序。
但是现在我遇到了一些关于线程的问题。
我只是做了一个简单的测试程序,比如底部:
程序只是试图将数字附加到文本框,但它崩溃了。
我不知道为什么,但我可以通过删除评论来阻止它(time.sleep)
import sys
import threading
import time
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Some(QWidget):
e = threading.Event()
def btnfunc(self):
self.e.set()
def __init__(self):
super().__init__()
self.myButton = QPushButton('do next')
self.logs = QTextEdit()
self.mylay = QVBoxLayout()
self.mylay.addWidget(self.myButton)
self.mylay.addWidget(self.logs)
self.setLayout(self.mylay)
self.setGeometry(300, 300, 300, 550)
self.setWindowTitle('mytest')
self.show()
t = threading.Thread(target=self.myfunc, args=( ))
t.start()
self.myButton.clicked.connect(self.btnfunc)
def myfunc(self):
for i in range(300):
# time.sleep(0.4)
self.logs.append(str(i))
if i == 20:
self.e.wait()
app = QApplication(sys.argv)
ex = Some()
sys.exit(app.exec_())
如果设置时间更高会更好。
我以为是资源访问的原因,因为它是 pyQT5 GUI。
所以我找到了 QThread。我试着像底部一样,
import sys
import time
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Some(QWidget):
qw = QWaitCondition()
qm = QMutex()
def btnfunc(self):
self.qw.wakeAll()
def __init__(self):
super().__init__()
self.myButton = QPushButton('do next')
self.logs = QTextEdit()
self.mylay = QVBoxLayout()
self.mylay.addWidget(self.myButton)
self.mylay.addWidget(self.logs)
self.setLayout(self.mylay)
self.setGeometry(300, 300, 300, 550)
self.setWindowTitle('mytest')
self.show()
self.myButton.clicked.connect(self.btnfunc)
self.thread = QThread()
self.thread.started.connect(self.myfunc)
self.thread.start()
def myfunc(self):
for i in range(300):
self.logs.append(str(i))
if i == 20:
self.qw.wait(self.qm)
app = QApplication(sys.argv)
ex = Some()
sys.exit(app.exec_())
但是崩溃,不起作用。并尝试了 QThread+threading.Event()。它冻结了 GUI。
现在不知道怎么办了……
编辑: 我刚刚意识到线程。不应从除 QThread 之外的其他线程访问。 那我就继续找QWaitCondition
【问题讨论】:
-
它在哪里崩溃以及出现什么消息?你能不能从例子中去掉更多不必要的东西,让它们变得更容易?
-
@Trilarion 这不是来自消息。我刚刚意识到这是因为 QWidget 的线程安全。顺便说一句,感谢您的评论。
标签: python multithreading python-multithreading qthread pyqt5