2016-12-02 3 views
1

Ich versuche eine Warnmeldung zu machen, die nach einigen Sekunden automatisch verschwindet. Ich habe diesen Code getan:pyqt: messagebox wird automatisch nach einigen Sekunden geschlossen

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_() 

Es funktioniert eigentlich in Ordnung, für den automatischen Schließteil. Mein Problem ist, dass, wenn jemand versucht, es vor den paar Sekunden manuell zu schließen, durch Klicken auf die x-Schaltfläche des Fensters, das Meldungsfeld nie geschlossen wird. Die "Wartezeit" wird negativ, das Meldungsfeld zeigt z. B. "automatisch geschlossen in -4 Sekunden" an und wird nie geschlossen.

Irgendeine Idee, wie ich das vermeiden könnte? Grüße

+0

mit meiner Lösung versuchen – eyllanesc

Antwort

1

mit meiner Lösung Versuchen Sie, Ich habe eine neue Art von QMessageBox erstellt mit Ihren Anforderungen

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

Es gibt eine off-by einen Fehler in Ihrem Zähler. Sie sollten 'self.time_to_wait - = 1' an das Ende von' changeContent' verschieben. Entfernen Sie dann den Aufruf 'setText' in' __init__' und rufen Sie 'self.changeContent()' auf, bevor Sie den Timer starten. (PS: es wäre auch schöner, wenn Sie [new-style signal and slot syntax] verwenden (http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html)). – ekhumoro

+0

@ekhumoro das ist pyqt4, new-style-Signal und Slots-Syntax ist nur für pyqt5 – eyllanesc

+0

Nein, sie sind auch in PyQt4. Der Link, den ich gab, ist für die PyQt4-Dokumente. – ekhumoro

Verwandte Themen