2016-12-02 83 views
1

我试图做一个警告消息框,几秒钟后自动消失。 我已经做了这样的代码:pyqt:几秒后自动关闭messagebox

def warning(self): 
    messagebox = QtGui.QMessageBox(self) 
    messagebox.setWindowTitle("wait") 
    messagebox.setText("wait (closing automatically in {0} secondes.)".format(3)) 
    messagebox.setStandardButtons(messagebox.NoButton) 
    self.timer2 = QtCore.QTimer() 
    self.time_to_wait = 3 
    def close_messagebox(e): 
     e.accept() 
     self.timer2.stop() 
     self.time_to_wait = 3 
    def decompte(): 
     messagebox.setText("wait (closing automatically in {0} secondes.)".format(self.time_to_wait)) 
     if self.time_to_wait <= 0: 
     messagebox.closeEvent = close_messagebox 
     messagebox.close() 
     self.time_to_wait -= 1 
    self.connect(self.timer2,QtCore.SIGNAL("timeout()"),decompte) 
    self.timer2.start(1000) 
    messagebox.exec_() 

它的工作原理实际上是罚款,对于自动关闭部分。 我的问题是,当有人试图在几秒钟之前手动关闭它时,通过单击窗口的x按钮,消息框永远不会关闭。 “等待时间”变为负值,消息框例如显示“在-4秒内自动关闭”,并且它永远不会关闭。

任何想法,我可以避免这种情况? 问候

+0

尝试用我的解决方案 – eyllanesc

回答

1

尝试用我的解决方案, 我创建了一个新的类型QMessageBox提示与您的要求

import sys 
from PyQt4 import QtCore 
from PyQt4 import QtGui 


class TimerMessageBox(QtGui.QMessageBox): 
    def __init__(self, timeout=3, parent=None): 
     super(TimerMessageBox, self).__init__(parent) 
     self.setWindowTitle("wait") 
     self.time_to_wait = timeout 
     self.setText("wait (closing automatically in {0} secondes.)".format(timeout)) 
     self.setStandardButtons(QtGui.QMessageBox.NoButton) 
     self.timer = QtCore.QTimer(self) 
     self.timer.setInterval(1000) 
     self.timer.timeout.connect(self.changeContent) 
     self.timer.start() 

    def changeContent(self): 
     self.setText("wait (closing automatically in {0} secondes.)".format(self.time_to_wait)) 
     self.time_to_wait -= 1 
     if self.time_to_wait <= 0: 
      self.close() 

    def closeEvent(self, event): 
     self.timer.stop() 
     event.accept() 


class Example(QtGui.QWidget): 
    def __init__(self): 
     super(Example, self).__init__() 
     btn = QtGui.QPushButton('Button', self) 
     btn.resize(btn.sizeHint()) 
     btn.move(50, 50) 
     self.setWindowTitle('Example') 
     btn.clicked.connect(self.warning) 

    def warning(self): 
     messagebox = TimerMessageBox(5, self) 
     messagebox.exec_() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

没有在你的柜台关闭的情况一个错误。您应该将'self.time_to_wait - = 1'移动到'changeContent'的末尾。然后在启动定时器之前,在__init__中移除'setText'调用并调用'self.changeContent()'。 (PS:如果你使用[新型信号和插槽语法](http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html)),它也会更好。 – ekhumoro

+0

@ekhumoro这是pyqt4,新式信号和插槽语法仅适用于pyqt5 – eyllanesc

+0

不,它们也在PyQt4中。我给出的链接是PyQt4文档。 – ekhumoro