我可以QStatusBar通過輸入單個字串來顯示訊息,例如:
self.statusBar().showMessage("My message here, also show it for 1 sec", 1000)
在我的事件回圈中,上述訊息將在狀態欄上顯示 1000 毫秒。但是說"My message here",我有一個字串串列,而不是一個字串,我想當時顯示一個。我可以通過給它一個延遲來通過一個回圈來做到這一點time.sleep(1)- 但不幸的是,這會阻塞 gui,直到回圈結束,我不希望那樣。我可以將主事件回圈和狀態欄更新的程序分開嗎?如果可以,如何?
下面的示例代碼有一個按鈕,當按下該按鈕時,會生成三個不同的訊息,存盤在一個串列中。然后它們會顯示在狀態欄中,一次一個,并且在回圈結束之前無法按下按鈕。我想要的行為是該按鈕是可點擊的(gui 未被阻止),如果在顯示以前的訊息時單擊它,則顯示被中斷并顯示新訊息。
---下面的示例代碼---
import sys
import time
from PyQt5 import QtWidgets
class Window(QtWidgets.QMainWindow):
"""Main Window."""
MSG_ID = 1
def __init__(self, parent=None):
"""Initializer."""
super().__init__(parent)
#stuff
self.messages = []
self.setWindowTitle('Main Window')
self.setStatusBar(QtWidgets.QStatusBar())
self.statusBar().showMessage("My message first time")
self.button = QtWidgets.QPushButton("Test",self)
self.button.clicked.connect(self.handleButton)
def handleButton(self):
self.messages = [f"message_num {msg_id}" for msg_id in range(Window.MSG_ID,Window.MSG_ID 3)]
Window.MSG_ID =3
self.updateStatus()
print(self.messages)
def updateStatus(self):
self.statusBar().clearMessage()
for item in self.messages:
self.statusBar().showMessage(item,1000)
time.sleep(1.2)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
上面的代碼創建了一個訊息串列
uj5u.com熱心網友回復:
無需為此使用計時器或睡眠,因為每次臨時訊息更改(包括洗掉時)時,狀態欄都會發送messageChanged 信號。這可用于創建一個簡單的回呼回圈來執行您想要的操作:
class Window(QtWidgets.QMainWindow):
...
def __init__(self, parent=None):
...
self.statusBar().messageChanged.connect(self.updateStatus)
def handleButton(self):
self.messages = [f"message_num {msg_id}" for msg_id in range(Window.MSG_ID,Window.MSG_ID 3)]
Window.MSG_ID =3
self.updateStatus()
def updateStatus(self, message=None):
print('update-status:', (message, self.messages))
if not message and self.messages:
self.statusBar().showMessage(self.messages.pop(0), 1000)
這不會阻止 gui,并允許通過單擊按鈕隨時重新啟動訊息序列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/417266.html
標籤:
上一篇:優化.append嵌套回圈
