Rudi: Python / PySide / QT4 - Frage: Messagebox Dialogbox erstellen

Hallo,

ich weiß nicht, ob ich hier richtig bin, aber ich versuchs einfach mal.

Ich versuche mich, in Python ein bischen einzuarbeiten und habe mir als erstes kleines Projekt vorgenommen, einen Timer zu schreiben, der jede Stunde eine Meldung gibt.

Das klappt in der Konsole auch ganz gut.

Nur:

Dazu müsste ich dann die Konsole immer geöffnet halten. Ich möchte aber im Rechner weiter arbeiten und lieber jede Std. ein Popup generieren, das quasi so aussieht, wie eine Messagebox (nur eben ohne Parentfenster).

Geht das (in PySide / bzw. QT4)?

Rudi

  1. Moin,

    Ich versuche mich, in Python ein bischen einzuarbeiten und habe mir als erstes kleines Projekt vorgenommen, einen Timer zu schreiben, der jede Stunde eine Meldung gibt.

    [...]

    Dazu müsste ich dann die Konsole immer geöffnet halten. Ich möchte aber im Rechner weiter arbeiten und lieber jede Std. ein Popup generieren, das quasi so aussieht, wie eine Messagebox (nur eben ohne Parentfenster).

    Du kannst am Rechner auch weiter arbeiten, wenn die Konsole offen ist ;)

    Geht das (in PySide / bzw. QT4)?

    Ja, aber warum Qt4 und nicht gleich Python3 + PyQt5?

    Die MessageBox-Klasse von Qt besitzt auch statische Funktionen, die deinen Zweck erfüllen können:

    from PyQt5.Qt import *
    from PyQt5.QtGui import *
    from sys import argv, exit
    
    a = QApplication(argv)
    QMessageBox.information(None, 'Information', 'Du bist informiert')
    exit(a.exec())
    

    Viele Grüße
    Robert

    1. Hallo Robert,

      Du kannst am Rechner auch weiter arbeiten, wenn die Konsole offen ist ;)

      Richtig, aber der Timer soll sich doch nach x Minuten bei mir melden :)

      Geht das (in PySide / bzw. QT4)?

      Ja, aber warum Qt4 und nicht gleich Python3 + PyQt5?

      Da ich nicht wußte, was ich nehmen sollte, habe ich mich erstmal für das entschieden, was (so meine Recherche) unter LGPL läuft und kam somit zur Kombination Python 3.4 und PsYide (äquivalent zu QT4).

      Die MessageBox-Klasse von Qt besitzt auch statische Funktionen, die deinen Zweck erfüllen können:

      from PyQt5.Qt import *
      from PyQt5.QtGui import *
      from sys import argv, exit
      
      a = QApplication(argv)
      QMessageBox.information(None, 'Information', 'Du bist informiert')
      exit(a.exec())
      

      Nett gemeint, Robert. Aber damit kann ich ja nicht wirklich etwas anfangen :(

      Rudi

      1. Moin Rudi,

        Du kannst am Rechner auch weiter arbeiten, wenn die Konsole offen ist ;)

        Richtig, aber der Timer soll sich doch nach x Minuten bei mir melden :)

        Kennst du die Escapesequenz '\a' bzw. den Beep-Befehl von Windows?

        Da ich nicht wußte, was ich nehmen sollte, habe ich mich erstmal für das entschieden, was (so meine Recherche) unter LGPL läuft und kam somit zur Kombination Python 3.4 und PsYide (äquivalent zu QT4).

        PySide und PyQt sind nicht äquivalent, sowohl was Funktionsumfang als auch Lizenz angehen.

        Nett gemeint, Robert. Aber damit kann ich ja nicht wirklich etwas anfangen :(

        Weil?

        Viele Grüße
        Robert

        1. Hallo Robert,

          Kennst du die Escapesequenz '\a' bzw. den Beep-Befehl von Windows?

          nein. Bin ja Einsteiger.

          PySide und PyQt sind nicht äquivalent, sowohl was Funktionsumfang als auch Lizenz angehen.

          Ok. Aber was ist jetzt Dein Rat für mich? Umsteigen? Obwohl ich weder das Eine kenne noch das Andere? Und vor allem: Für mein erstes kleines Testprogrämmchen?

          Nett gemeint, Robert. Aber damit kann ich ja nicht wirklich etwas anfangen :(

          Weil?

          Ich nunmal nicht QT5 nutze. Und bei mir der Code nicht läuft. :-(

          Rudi

          1. Moin Rudi,

            Kennst du die Escapesequenz '\a' bzw. den Beep-Befehl von Windows?

            nein. Bin ja Einsteiger.

            Damit kannst du auch bei einem Konsolenprogramm einen Biep ausgeben lassen.

            PySide und PyQt sind nicht äquivalent, sowohl was Funktionsumfang als auch Lizenz angehen.

            Ok. Aber was ist jetzt Dein Rat für mich? Umsteigen? Obwohl ich weder das Eine kenne noch das Andere? Und vor allem: Für mein erstes kleines Testprogrämmchen?

            Da du dich gerade erst einarbeitest, hast du doch noch viel mehr die Freiheit, ohne große Verluste auf etwas Anderes umzuschwenken. Ich empfehle für GUI-Programmierung Qt5 und das ist bislang nur mit PyQt5 von Python aus zu erreichen, Pyside ist noch nicht so weit. Qt5 hat die konsistentere API und wird noch weiter entwickelt, während ich bei Qt4 skeptisch bin, dass es da noch weitergeht.

            Das erste Testprogramm kann zur Vermeidung der Komplexität in deinem Fall ein Einzeiler sein:

            print('\a')
            

            Und das dann in regelmäßigen Abständen vom Betriebssystem aufgerufen. Oder du baust eine Endlosschleife mit einem sleep (oder ähnlich).

            Ich nunmal nicht QT5 nutze. Und bei mir der Code nicht läuft. :-(

            Mein Code war auch Qt5, wie beschrieben. Kannst du denn Qt5 und PyQt5 installieren? Und unter welchem Betriebssystem arbeitest du überhaupt?

            Viele Grüße
            Robert

            1. Hi Robert,

              Das erste Testprogramm kann zur Vermeidung der Komplexität in deinem Fall ein Einzeiler sein:

              print('\a')
              

              Gibt bei mir in IDLE nur einen blauen Punkt aus. Ich habe es so gelöst.

              import winsound
              Freq = 800 # Set Frequency To 2500 Hertz
              Dur = 1000 # Set Duration To 1000 ms == 1 second
              winsound.Beep(Freq,Dur)
              

              Ich nunmal nicht QT5 nutze. Und bei mir der Code nicht läuft. :-(

              Mein Code war auch Qt5, wie beschrieben. Kannst du denn Qt5 und PyQt5 installieren? Und unter welchem Betriebssystem arbeitest du überhaupt?

              Bestimmt kann ich das, aber es kann ja nicht die Lösung sein, eine neue Entwicklungsumgebung für "so einen Peanuts" zu installieren. Oder ist das tatsächlich mit Python 3.4 und QT4 noch nicht machbar? Das kann doch nicht sein, oder?

              Rudi

              1. Moin Rudi,

                Ich habe es so gelöst.

                import winsound
                Freq = 800 # Set Frequency To 2500 Hertz
                Dur = 1000 # Set Duration To 1000 ms == 1 second
                winsound.Beep(Freq,Dur)
                

                Gut, damit ist dann schon einmal die Frage nach dem verwendeten Betriebssystem gelöst. '\a' ist AFAIK ein POSIX-Ding, funktioniert also unter Linux oder Unix.

                Mein Code war auch Qt5, wie beschrieben. Kannst du denn Qt5 und PyQt5 installieren? Und unter welchem Betriebssystem arbeitest du überhaupt?

                Bestimmt kann ich das, aber es kann ja nicht die Lösung sein, eine neue Entwicklungsumgebung für "so einen Peanuts" zu installieren. Oder ist das tatsächlich mit Python 3.4 und QT4 noch nicht machbar? Das kann doch nicht sein, oder?

                Qt ist keine Entwicklungsumgebung, sondern eine Bibliothek. Du kannst mein Beispiel auch in Qt4 implementieren, aber ich empfinde Qt5 als ausgereifter und zukunftsfähiger. Da die verschiedenen Qt-Hauptversionen zueinander inkompatibel sind, möchte ich dir mit meinem Vorschlag für Qt5 den späteren Umstieg ersparen.

                Viele Grüße
                Robert

                1. Hi Robert,

                  Da die verschiedenen Qt-Hauptversionen zueinander inkompatibel sind, möchte ich dir mit meinem Vorschlag für Qt5 den späteren Umstieg ersparen.

                  Gib mir hierfür etwas Zeit. Ich bin froh, Python+PySide zum Laufen bekomen zu haben. ;)

                  import sys
                  import time
                  
                  from PySide import QtGui
                  
                  run = input("Start? > ")
                  mins = 0
                  # Only run if the user types in "start"
                  if run == "start":
                      # Loop until we reach 20 minutes running
                      while mins != 20:
                          print (mins)
                          # Sleep for a minute
                          time.sleep(60)
                          # Increment the minute total
                          mins += 1
                      # Bring up the dialog box here
                      app = QtGui.QApplication(sys.argv)
                      a=QtGui.QMessageBox.information(None,"","Meine Nachricht!")
                  

                  Macht genau, was ich möchte.

                  Aber wie bekomme ich das Message-Fenster in den Vordergrund?

                  Rudi

                  1. Moin Rudi,

                    app = QtGui.QApplication(sys.argv)
                    a=QtGui.QMessageBox.information(None,"","Meine Nachricht!")
                    

                    Aber wie bekomme ich das Message-Fenster in den Vordergrund?

                    Muss nicht noch die Eventschleife von Qt mit der Methode exec aufgerufen werden?

                    a.exec()
                    

                    Viele Grüße
                    Robert

                    1. Hi Robert,

                      Muss nicht noch die Eventschleife von Qt mit der Methode exec aufgerufen werden?

                      a.exec()
                      

                      Nein. Zumindest ändert es gar nichts, ob ich es zusätzlich notiere oder nicht.

                      Aber wie bekomme ich das Messagefenster in den Vordergrund? Hast Du eine Idee?

                      Rudi

                      1. Moin Rudi,

                        Aber wie bekomme ich das Messagefenster in den Vordergrund? Hast Du eine Idee?

                        Das weiß ich leider auch nicht.

                        Viele Grüße
                        Robert

                      2. Hallo

                        Aber wie bekomme ich das Messagefenster in den Vordergrund? Hast Du eine Idee?

                        Gibt's denn in der Bibliothek keine fertigen Funktionen, um ein Fenster zu aktivieren? Was sagt denn die Dokumentation dazu?

                        Tschö, Auge

                        --
                        Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                        Wolfgang Schneidewind *prust*
                        1. Hi,

                          Gibt's denn in der Bibliothek keine fertigen Funktionen, um ein Fenster zu aktivieren? Was sagt denn die Dokumentation dazu?

                          Ich habe bisher nichts dazu gefunden, was dann auch wirklich funktionierte. Nur was nützt ein Fenster, was unbemerkt im Hintergrund aufpopt?

                          Rudi

  2. Tach!

    Dazu müsste ich dann die Konsole immer geöffnet halten. Ich möchte aber im Rechner weiter arbeiten und lieber jede Std. ein Popup generieren, das quasi so aussieht, wie eine Messagebox (nur eben ohne Parentfenster).

    Das Programm muss entweder immer laufen oder es muss im Betriebssystem einen Timer geben, der das Programm zur angegebenen Zeit startet.

    Wenn ersteres nicht als sichtbares Programm stattfinden soll, braucht es einen Dienst oder Daemon oder wie auch immer das in dem von dir verwendeten Betriebssystem heißt und implementiert ist.

    Timersysteme heißen unter Linux crontab oder at oder unter Windows Scheduled Tasks.

    dedlfix.

    1. Hi dedlfix,

      Das Programm muss entweder immer laufen oder es muss im Betriebssystem einen Timer geben, der das Programm zur angegebenen Zeit startet.

      Es darf ja im Hintergrund laufen, das ist nicht mein Problem. Aber es muß sich bei mir melden. Wenn es nur läuft und ich muß es selber immer wieder mal aufmachen, ist es leichter, auf die Uhr zu schauen ;)

      Rudi