Tkinter und Threads

Fragen zu Tkinter.
Antworten
Programmer
User
Beiträge: 16
Registriert: Samstag 4. Oktober 2014, 19:36

Hallo ,

ich habe in meinem Programm mehrere threads drin die ständig laufen , wegen einer schleife in jedem thread , nunja mein Programm also die GUI oberfläche ist häufig sehr langsam oder reagiert gar nicht , nun ist meine Frage liegt das daran dass ich diese threads habe und die ständig laufen?
Habe 7 Stück mit diesem befehl gestartet :

Code: Alles auswählen

start_new_thread()
MFG

Progammer
BlackJack

@Programmer: Erstmal ist das grundsätzlich die falsche Funktion weil das `thread`-Modul schon seit einer Ewigkeit durch das `threading`-Modul abgelöst wurde und in Python 3 auch gar nicht mehr zur öffentlichen API gehört.

Ansonsten ist die Frage was diese Threads tun und vor allem wie sie mit der GUI interagieren, denn das tun sie hoffentlich gar nicht, denn `Tkinter` ist wie die meisten GUI-Rahmenwerke nicht thread-sicher. Man darf die GUI nur aus dem Thread manipulieren in dem auch die GUI-Hauptschleife läuft, sonst ist das Verhalten des Programms undefiniert!
Programmer
User
Beiträge: 16
Registriert: Samstag 4. Oktober 2014, 19:36

Okay habe ich auch sofort geändert in threading, ja und sonst weiß ich nicht so genau was du meinst ich kann mal ebend den code von einem thread hier zeigen, im prinzip sind die anderen auch so aufgebaut nur mit anderen Variablen:

Code: Alles auswählen

def funkrtw1():
    global verfrtw1
    global crtw1
    global statrtw1
    global freigabe
    global einsatz
    
    loop = 1
    while loop == 1:
        
        if verfrtw1 == 0:
            c = random.randint(10,50)
            time.sleep(c)
            statrtw1 += 3
            meld.insert("end",time.strftime('%H:%M:%S') + ">>RTW-1 Status 3")
            crtw1.config(text = "3", bg = "red")
            loop -= 1

            while einsatz == 1:
                if freigabe == 1:
                    meld.insert("end",time.strftime('%H:%M:%S') + ">>RTW-1 Status 4")
                    crtw1.config(text = "4", bg = "blue")
                    time.sleep(c)
                    meld.insert("end",time.strftime('%H:%M:%S') + ">>RTW-1 Status 1")
                    crtw1.config(text = "1", bg = "green")
                    verfrtw1 += 1
                    loop += 1
BlackJack

@Programmer: Die Namen sind ziemlich schlecht gewählt. Versuch das mal ohne Abkürzungen und ohne durchnummerieren von Namen. Falls „im Prinzip“ und „nur andere Namen” bedeutet das Du pro RTW eine Funktion hast die genau das gleiche tut nur mit anders nummerierten Namen dann ist die Strukturierung des Programms murks, denn genau wegen der Parametrisierung hat man ja Funktionen, damit man nicht immer den gleichen Code im Programm kopiert sondern den nur einmal hat und die Unterschiede als Argumente heraus zieht.

``global`` hat in einem sauberen Programm nichts zu suchen. Es gibt objektorientierte Programmierung (OOP) um Programme ohne solche undurchsichtigen Abhängigkeiten zwischen Funktionen zu schreiben. Und gerade bei GUI-Programmierung kommt man um OOP in Python sowieso nicht sinnvoll herum.

Wen diese Funktion in einem eigenen Thread ausgeführt wird, dann ist das Programm fehlerhaft weil wie gesagt die GUI nicht aus anderen Threads manipuliert werden darf als dem in dem die GUI-Hauptschleife läuft.
Programmer
User
Beiträge: 16
Registriert: Samstag 4. Oktober 2014, 19:36

Okay danke dir aufjedenfall , da ich noch so relativ am Anfang bin sind das eh nur "Spaß"Programme daich da drann gerne lernen möchte , kannst mir irgendwelche seiten empfehlen oder ähnliche das mir OOP bei Python ein bisschen näher bringt :)
Antworten