2016-12-02 6 views
1

Я пытаюсь сделать окно предупреждения, которое автоматически исчезает через несколько секунд. я сделал этот код:pyqt: сообщение автоматически закрывается через несколько секунд

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'. Затем удалите вызов 'setText' в' __init__' и вызовите 'self.changeContent()' перед запуском таймера. (PS: было бы неплохо, если бы вы использовали [новый стиль и синтаксис слотов] (http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html)). – ekhumoro

+0

@ekhumoro это pyqt4, новый синтаксис сигнала и слотов только для pyqt5 – eyllanesc

+0

Нет, они также находятся в PyQt4. Ссылка, которую я дал, предназначена для документов PyQt4. – ekhumoro