python – PySide中的子线程中的计时器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – PySide中的子线程中的计时器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2419字,纯文字阅读大概需要4分钟。
内容图文
![python – PySide中的子线程中的计时器](/upload/InfoBanner/zyjiaocheng/721/3bd9075cda434dcd9af6a65e69a5231e.jpg)
首先,我对Python和Pyside很新.为了做一些自我改进,我试图在我的PySide程序的子线程中每秒执行一次QTimer执行(此时我只想让它每秒钟打印一个终端“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)
另外,使用UpperCase作为类的第一个字母,使用camelCase作为方法.你正在做两种方式的混合.
基于您提供的链接,您的示例以及此处的其他注释的几个注释…如果您的doWork()非常轻,并且不会阻止主事件循环,则可以仅使用QTimer作为解决方案数据运算,休眠等等.如果确实如此,则需要将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中的子线程中的计时器全部内容,希望文章能够帮你解决python – PySide中的子线程中的计时器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。