拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 PyQt5-从字符串串列中重复更新状态栏而不阻塞gui

PyQt5-从字符串串列中重复更新状态栏而不阻塞gui

白鹭 - 2022-02-17 1968 0 0

我可以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,并允许通过单击按钮随时重新启动讯息序列。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *