QTimer和QThread奇数行为

2024-04-25 11:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

from PySide.QtGui import *
from PySide.QtCore import *
import sys
from time import sleep

class MyWorkerThread(QThread):
    def __init__(self, parent=None):
        super(MyWorkerThread, self).__init__(parent)

    def run(self):
        timer1 = QTimer()
        timer1.singleShot(1000, self.alarm_goes1)
        print "Timer 1 Start"
        timer1.start()

    def alarm_goes1(self):
        print "goes off 1"


class MainFrame(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.thread = MyWorkerThread(self)
        print "Thread Start"
        self.thread.start()

        timer2 = QTimer()
        timer2.singleShot(1000, self.alarm_goes2)
        print "Timer 2 Start"
        timer2.start()

    def alarm_goes2(self):
        print 'goes off 2'

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainFrame()
    main.show()
    sys.exit(app.exec_())

输出:

^{pr2}$

请解释为什么警报不执行。我怎么才能做到呢?在


编辑:

def run(self):
    timer1 = QTimer()
    timer1.singleShot(2000, self.alarm_goes1)
    print "Timer 1 Start"
    timer1.start()
    self.exec_()
    self._alive = True
    while self._alive:
        print 'this part will not execute'
        self.sleep(1)

有了self.exec_()两个计时器都可以正常工作,但是while循环中的部分就不行了。如果没有self.exec_(),只有一个计时器可以工作,而while循环可以工作。在

我要定时器和while循环一起工作。在

我尝试将self.exec_()移到while循环中,但它只运行一次。在


Tags: fromimportselfinitdefsysstartexec
1条回答
网友
1楼 · 发布于 2024-04-25 11:57:50

计时器发布一个QTimerEvent,但线程中没有运行事件循环来处理它。在

所以你需要这样做:

    def run(self):
        timer1 = QTimer()
        timer1.singleShot(1000, self.alarm_goes1)
        print "Timer 1 Start"
        timer1.start()
        # start the clock
        clock = QTimer()
        clock.start(1000)
        clock.timeout.connect(self.tick)
        # start the thread's event loop
        self.exec_()

    def tick(self):
        print 'tick'

最好将其添加到MainFrame类中:

^{pr2}$

相关问题 更多 >

    热门问题