【问题标题】:A confirmation message that disappears pyqt5 [duplicate]消失的确认消息pyqt5 [重复]
【发布时间】:2023-03-25 17:30:01
【问题描述】:

我想显示一个如下图所示的确认图像,该图像在启动后会在 2 秒内消失。我可以显示图像,但之后我不能让它消失。我尝试使用睡眠(2),但在这种情况下,图像每 2 秒变为全黑。谢谢你帮助我

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    您的应用程序变黑,因为事件循环没有运行。

    Qt 通过让事件循环永远运行来运行。它等待事件并在它们进入队列时对其进行处理。事件循环正在获取一个事件,调用您的函数,并等待您的函数完成,直到它继续运行下一个事件。您的函数显示窗口/小部件/对话框,然后在 time.sleep 中停留 2 秒。当它处于 time.sleep 时,Qt 事件循环仍在等待您的函数结束以处理更多事件。

    有 3 种方法可以处理这种情况。

    1. QTimer(根据您的情况推荐)。
      • 显示您的小部件并告诉计时器在 2 秒内调用您的函数。
      • 这将使您的函数立即退出,因此事件循环可以继续处理
      • 2 秒后计时器将调用关闭函数
    2. 线程(线程实际上是用于 I/O 的,例如 TCP 套接字)。
    3. QApplication.processEvents()
      • 显示您的对话框并运行一个等待 2 秒的循环。
      • 当循环运行并检查是否已过 2 秒时,通知事件循环处理事件。

    QTimer - 您只需显示您的窗口,然后让计时器调用一个函数来关闭您的窗口。

    self.widg  = ...
    self.widg.show() 
    self.widg.raise_()  # if already show bring to top
    
    def close_and_delete_widg():
        self.widg.close()
        self.widg.setParent(None)  # Remove reference
        self.widg.deleteLater()
        self.widg = None  # Remove python reference count.
    
    self.tmr = QtCore.QTimer()
    self.tmr.setSingleShot(True)
    self.tmr.timeout.connect(close_and_delete_widg)
    self.tmr.start(2000)  # 2 sec
    

    我创建了一个库来帮助在近似超时qt_thread_updater 上运行。该库通过持续运行计时器和调用已发布的函数来工作。你基本上告诉它运行一个函数,它稍后会在主事件循环中运行一个函数。延迟函数不准确。这个库更多地用于线程。但是,它使您无需管理计时器。

    from qt_thread_updater import get_updater
    
    self.widg  = ...
    self.widg.show() 
    self.widg.raise_()  # if already show bring to top
    
    def close_and_delete_widg():
        self.widg.close()
        self.widg.setParent(None)  # Remove reference
        self.widg.deleteLater()
        self.widg = None  # Remove python reference count.
    
    get_updater().delay(2, close_and_delete_widg)  # After approximately 2 seconds call
    

    线程 - 我将跳过,因为您的用例不需要它。

    QApplication.processEvents() - 不建议这样做。它可能会导致问题,但可能仍然有效。本质上,事件循环正在等待您的函数完成。如果您致电 QApplication.processEvents(),您是在告诉您的应用程序在您当前正在等待此事件完成时处理更多事件。

    self.widg  = ...
    self.widg.show() 
    self.widg.raise_()  # if already show bring to top
    
    start = time.time()
    while (time.time() - start) <= 2:  # Sec or msec?
        QtCore.QApplication.processEvents()  # QtCore.QApplication.instance().processEvents()
    
    # Close and delete the widget
    self.widg.close()
    self.widg.deleteLater()
    self.widg = None
    

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 2021-12-17
      • 2023-03-16
      • 2021-10-28
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多