使用 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
使用 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