Anfängerproblem - GUI + Endlosschleife + Anzeige

  • Hallo,

    nun versuche ich schon seit Tagen...

    Die GUI funktioniert.

    Das Programm soll u.a. 8 Relais automatisch ein & aus schalten. (je nachdem, wie voll die Solarbatterie ist..)

    Klicke ich auf das Fenster "Home-Modus" => ab def home_modus(self, event): , wird die Spannung an der Batterie gemessen.

    Bis jetzt werden erstmal nur 2 Relais zum Test darüber dann automatisch geschaltet.

    Und irgendwie habe ich es auch geschafft, dass die Spannung dann innerhalb der GUI angezeigt wird.

    Jedoch wird das Textfenster => self.text_ctrl_4 = wx.TextCtrl(self, wx.ID_ANY, str(voltage1), pos = ( 717, 252), size = ( 235, 245 )) erst im Hauptprogramm angezeigt.

    Aber wie bekomme ich so eine Endlosschleife hin?

    (die Spannung, u.s.w. soll ständig abgefragt werden und nicht nur bei einem Klick auf das Fenster)

    Oder, wie kann ich aus einem Unterprogramm die Spannung, direkt anzeigen lassen?

    Also, innerhalb "def home_modus(self, event):" oder "def f(event):"

    "def f(event):" läuft als MultiProcess parallel zum Hauptprogramm. Dieses erzeugt bisher nur ein Frame. Aber leider keine Ausgabe der Spannung, an der richtigen Position.

    Ein Extra Frame wäre aber keine gute Lösung. Am liebsten innerhalb der GUI. So wie es schon funktioniert, nur irgendwie in einer Endlosschleife. So, dass ständig die aktuelle Spannung zu sehen ist.


    Das ganze sollte eigentlich ein Weihnachtsgeschenk werden.

    Aber da ich erst seit 2 Wochen erstmalig programmiere, brauche ich mehr Zeit oder einen Tip... :helpnew:  :?:

    Und hier der ganze Code (darunter ein Foto der GUI):



  • Hallo,


    Kurzfassung: Endlosschleife und GUI ist schlecht, weil, dann der Mainloop der GUI blockiert wird.

    Lösung: die Funktion periodisch aufrufen, dafür haben alle GUIs passende Methoden. Bei Tkinter heißt das ˋafterˋ, keine Ahnung, wie dass bei wx heißt. Das ist ja heute eher exotisch als gängig.


    Was anderes: du verwendest noch Python 2, dass ist ab dem 1.1.2020 ohne Support durch die Python Entwickler. Du solltest also schleunigst auf Python 3 umsteigen.

    Und die Verwendung von ˋglobalˋ ist in 99,9% der Fälle falsch und schlecht. Du hast doch eine Klasse, also solltest du deren Attribute verwenden.


    Gruß, noisefloor

  • Vielen Dank für deine Tipps...

    Ich verwende Python 3. Vermutlich habe ich die ersten Zeilen nur von irgendwo kopiert..
    Und ja, über "global" & Variablen, mache ich mich nochmal schlau.

    Am Wichtigsten.. - Deine Lösung... :)

    Soweit ich bis jetzt googeln konnte, muss ich mich mit "wx.CallAfter" beschäftigen.
    Es wäre Super, wenn die Funktion periodisch (z.B. alle 0,1Sek.) aufgerufen wird.

    Nur wie, dass muss ich noch heraus finden... :conf:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!