【发布时间】:2019-04-30 18:42:57
【问题描述】:
我最近想尝试使用 Wing IDE 而不是 Eclipse+Pydev 来使用 PyQt5 编写简单的 roguelike 游戏。这个游戏使用单独的 QThread 和 QObject 来处理游戏状态而不冻结 GUI。但是,我当前的应用程序(与标准和 Eclipse 的解释器配合良好)在 Wing IDE 中冻结。在这里,我发布了代表问题的简单代码:
import sys, time
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QObject, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLCDNumber, QVBoxLayout, QWidget
class Counter(QObject):
'''
QObject-based class which works inside separate thread and
emits numbers from 1 to 10 to the GUI thread and then stops.
'''
new_value = pyqtSignal(int)
ended = pyqtSignal()
def __init__(self):
QObject.__init__(self)
self.isStopped = False
@pyqtSlot()
def start(self):
self.isStopped = False
for n in range(1, 11):
if not self.isStopped:
self.new_value.emit(n)
time.sleep(0.3)
else:
break
self.ended.emit()
@pyqtSlot()
def stop(self):
self.isStopped = True
class SimpleWindow(QMainWindow):
'''
Application window with 3 buttons and 1 LCD display.
'''
def __init__(self):
QMainWindow.__init__(self)
# Adding and configuring widgets
self.central = QWidget(self)
self.central.resize(100, 150)
self.resize(100, 150)
self.layout = QVBoxLayout()
self.central.setLayout(self.layout)
self.start_QBtn = QPushButton()
self.start_QBtn.setText('Start')
self.stop_QBtn = QPushButton()
self.stop_QBtn.setText('Stop')
self.number_LCD = QLCDNumber()
self.status_QBtn = QPushButton()
self.status_QBtn.setText('Status')
self.layout.addWidget(self.start_QBtn)
self.layout.addWidget(self.stop_QBtn)
self.layout.addWidget(self.status_QBtn)
self.layout.addWidget(self.number_LCD)
# Creating new thread and adding QObject-based object to it
self.thread = QThread()
self.counter = Counter()
self.counter.moveToThread(self.thread)
# Connecting button signals to slots
self.start_QBtn.clicked.connect(self.thread.start)
self.status_QBtn.clicked.connect(self.status)
self.stop_QBtn.clicked.connect(lambda: self.counter.stop())
# Connecting thread signals to slots
self.counter.new_value.connect(self.show_value)
self.counter.ended.connect(self.thread.quit)
self.thread.started.connect(self.counter.start)
self.thread.start()
@pyqtSlot(int)
def show_value(self, number):
'''
Display value obtained from Counter() in the LCD widget.
'''
self.number_LCD.display(number)
@pyqtSlot()
def status(self):
'''
Print thread status in the console.
'''
print('Thread is running: ', self.thread.isRunning())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = SimpleWindow()
window.show()
sys.exit(app.exec_())
应用程序启动,按预期显示从 1 到 10 的数字,然后冻结。尝试按下停止按钮时它也会冻结。有没有解决方案可以继续使用 QThread 和 Wing IDE?
我的系统是Windows 8 (x64),Python 3.7.1,Wing IDE Personal 6.1; PyQt5.11(也检查了 PyQt 5.7); Qt 5.7。
【问题讨论】:
标签: python python-3.x pyqt qthread