使用 PyQt5,实现两个 windows 自动永远循环

With PyQt5, implement two windows looping forever automatically

使用 PyQt5,我想实现两个 windows 自动一个接一个地显示,而无需用户与任何 window 交互。像这样:

While True:
    Show Window1    
    wait 2 seconds
    Close Window1
    Show Window2
    wait 2 seconds
    Close Window2

我遇到的问题是主UI线程卡在了app.exec_()函数中,所以无法实现打开和关闭逻辑。

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic


class Win1(QMainWindow):
    def __init__(self):
        super(Win1, self).__init__()
        uic.loadUi('win1.ui', self)
        self.show()
        
class Win2(QMainWindow):
    def __init__(self):
        super(Win2, self).__init__()
        uic.loadUi('win2.ui', self)
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)

    while True:
        win = Win1()
        time.sleep(1) 
        win.close()
        
        win = Win2()
        time.sleep(1)
        win.close()
        
        app.exec_() # <--------- Program blocks here

如果有人可以在不阻塞的情况下分享这个工作的最小示例,我将不胜感激。或者请指出应该使用的机制。

如果您打算使用 Qt,那么您应该忘记顺序逻辑,但您必须使用事件来实现逻辑。例如,在您的情况下,您希望每次 T 显示一个 window 并隐藏另一个 window ,以便可以使用 QTimer 和标志来实现:

import sys
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic


class Win1(QMainWindow):
    def __init__(self):
        super(Win1, self).__init__()
        uic.loadUi('win1.ui', self)
        self.show()
        

class Win2(QMainWindow):
    def __init__(self):
        super(Win2, self).__init__()
        uic.loadUi('win2.ui', self)
        self.show()


if __name__ == "__main__":

    app = QApplication(sys.argv)

    timer = QTimer()
    timer.setProperty("flag", True)

    win1 = Win1()
    win2 = Win2()

    def on_timeout():
        flag = timer.property("flag")
        if flag:
            win1.show()
            win2.close()
        else:
            win2.show()
            win1.close()
        timer.setProperty("flag", not flag)

    timer.timeout.connect(on_timeout)
    timer.start(1 * 1000)
    on_timeout()

    app.exec_()

您不应使用 while 循环或 time.sleep,因为它们会阻塞 GUI 所在的事件循环,即:它们会冻结 windows