gpt4 book ai didi

python - PySide 子线程中的计时器

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:36 25 4
gpt4 key购买 nike

首先,我是 Python 和 Pyside 的新手。为了进行一些 self 改进,我试图让 QTimer 在我的 PySide 程序的子线程中每秒执行一次(目前我只希望它每秒打印一次“hi!”到终端不卡住主窗口)。

我尝试转换 example I found on the 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_())

最佳答案

@Masci 已经指出了您的 timer.timeout.connect 所需的修复,但我看到的问题不止于此。

无需创建从未使用过的全局 QThread:

statsThread = QtCore.QThread()

您的 QTimer 正在立即被垃圾回收,因为它是在没有父对象的情况下创建的,并且您没有将它保存在您的类中。这就是为什么即使在您修复了定时器连接后,它仍然无法正常工作...尝试:

class UpdateGuiWithStats(QtCore.QObject):

def startWorker(self):
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.doWork)
self.timer.start(1000)

此外,类的首字母使用大写,方法使用驼峰式。您正在混合使用这两种方式。

基于您提供的链接、您的示例和此处的其他评论的一些注释...如果您的 doWork() 非常轻便,您可以只使用 QTimer 作为解决方案不会用一堆数据处理、 sleep 等来阻塞您的主事件循环。如果确实如此,那么 doWork() 将需要移动到 QThread,就像您的示例所做的那样。但在这一点上,有点没有必要使用事件循环,并在调用其自己的工作的单独类中使用 QTimer。这一切都可以合并到一个类中,例如:

class UpdateStatsThread(QtCore.QThread):

def __init__(self, parent=None):
super(UpdateStatsThread, self).__init__(parent)
self._running = False

def run(self):
self._running = True
while self._running:
self.doWork()
self.msleep(1000)

def stop(self, wait=False):
self._running = False
if wait:
self.wait()

def doWork(self):
print "hi!"

关于python - PySide 子线程中的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com