首先,我非常新于Python和Pyside。为了进行一些自我提高,我试图在我的PySide程序的子线程中使QTimer每秒执行一次(目前我只想让它每秒打印“hi!”到终端而不冻结主窗口)。
我尝试将Qt Wiki上找到的示例从C++转换为Python/PySide,但由于我不太了解C++,我认为我转换不正确,这就是为什么它不能正常工作的原因。
目前,doWork()函数似乎只执行一次,然后再也不执行了。我做错了什么?有没有更好的方法在PySide中每秒执行一个函数而不冻结主窗口?
以下是代码(我已删除一些主窗口代码以增加清晰度):
我尝试将Qt Wiki上找到的示例从C++转换为Python/PySide,但由于我不太了解C++,我认为我转换不正确,这就是为什么它不能正常工作的原因。
目前,doWork()函数似乎只执行一次,然后再也不执行了。我做错了什么?有没有更好的方法在PySide中每秒执行一个函数而不冻结主窗口?
以下是代码(我已删除一些主窗口代码以增加清晰度):
from PySide import QtGui
from PySide import QtCore
from client_gui import Ui_MainWindow
statsThread = QtCore.QThread()
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
#setup GUI
self.setupUi(self)
#start thread to update GUI
self.statsThread = updateStatsThread()
self.statsThread.start(QtCore.QThread.TimeCriticalPriority)
class updateGuiWithStats(QtCore.QObject):
def Worker(self):
timer = QtCore.QTimer()
timer.timeout.connect(self.doWork())
timer.start(1000)
def doWork(self):
print "hi!"
class updateStatsThread (QtCore.QThread):
def run(self):
updater = updateGuiWithStats()
updater.Worker()
self.exec_()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
frame = MainWindow()
frame.show()
sys.exit(app.exec_())
doWork()
中做更多的事情,而不仅仅是调用print "foo"
或其他东西。因此,我实现了你编写的改进后的UpdateStatsThread()
类。然而,在我尝试退出线程时,我收到了一个消息,说线程正在运行时被销毁了。我猜这是因为我在time.sleep(1)
仍在运行时就退出了线程。有什么好的方法可以退出线程并避免出现该消息吗? - James Mackenzie