tkinter pack() verzögert durch im Code nachgelagerte Funktion

Fragen zu Tkinter.
Antworten
LuAnd
User
Beiträge: 1
Registriert: Sonntag 23. August 2020, 10:40

Hallo zusammen,
bei meinem ersten tkinter-Projekt habe ich gleich eine Verständnisfrage zum Ablauf des Codes.
Ziel des kleinen CodeAusschnitts wäre es, dass nach der Erstellung (und Anzeige) der zweiten Toplevel-Fensters die Funktion NextFunction() ausgeführt wird.

Was ist die Ursache dafür, dass die Anzeige des zweiten Toplevel-Fensters mit pack() erst am Ende nach dem Warten mit time.sleep(10) durch NextFunction() erfolgt?
Der Pack()-Befehl steht doch in der "neuesFenster"-Funktion im Ablauf eindeutig vor dem Aufruf NextFunction()...

Code: Alles auswählen

import tkinter as tk
import time
import random
tkFenster = tk.Tk()
nameFenster=tkFenster
Counter =0

def NextFunction():
    print("Now waiting 10")
    time.sleep(10)


def neuesFenster():
    neuesToplevelFenster = tk.Toplevel(tkFenster)
    neuesToplevelFenster.geometry('%dx%d+%d+%d' % (75, 75, random.randrange(0, 200), random.randrange(0, 200)))
    button = tk.Button(neuesToplevelFenster, text="Beispiel")
    button.pack()
    print("Code bei Pack vorbei")
    global Counter
    Counter += 1
    if Counter == 2:
        NextFunction()


tkFenster.title('Hauptfenster')
tkFenster.geometry('600x480')
buttonNeu = tk.Button(master=tkFenster, command=neuesFenster)
buttonNeu.place(x=10, y=10, width=75, height=75)
tkFenster.mainloop()

Danke schon mal

Grüße, LuAnd
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

GUIs und sleep vertragen sich nicht. Wenn du etwas mit Verzögerung machen willst in tkinter, musst du die after Methode benutzen. Wir diskutieren das hier oft, stöber mal durch das unterforum.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@LuAnd: Weiterführend zu __deets__: Allle mir bekannten GUIs haben eine Hauptschleife (bei tkinter der mainloop), der für das Zeichnen der GUI zuständig ist. Die unterbricht man nach Möglichkeit nie - oder wenn es sein muss - nur wirklich kurz. Das Verhalten wird sonst schwierig bis unerwartet. Die Erfahrung machst du ja gerade, weil du die Hauptschleife mit sleep für 10 Sekunden unterbrichst.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablen- und Funktionsnamen schreibt man komplett klein. Warum bindest du tkFenster auch an nameFenster, was dann gar nicht benutzt wird? Vergiss gleich wieder, dass es global überhaupt gibt. Jedes nicht-triviale GUI-Programm betrachtet selbst definierte Klassen um den Zustand über das Ende einer Funktion hinaus zu speichern. Du darfst dir keinen linearen Programmablauf vorstellen. GUIs reagieren auf Ergebnisse.
Antworten