update_idletasks funktioniert nicht in Windows (tkinter)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
bi3mw
User
Beiträge: 11
Registriert: Mittwoch 19. Oktober 2022, 23:14

Folgender Code funktioniert unter Linux einwandfrei, aber unter Windows wird solange ein blankes Fenster angezeigt bis die gesamte Ausgabe abgearbeitet ist. Woran kann das liegen ?

Code: Alles auswählen

class TkConsole(tk.Tk):
    def __init__(self):
........
        self.console= tk.Text(self, width=80, height=20)
        scroll_bar = tk.Scrollbar(self)
        scroll_bar.pack(side=tk.RIGHT)
        self.console.pack(side=tk.LEFT)
        self.console.config(yscrollcommand=scroll_bar.set)
        scroll_bar.config(command=self.console.yview)
        
........        

    def open_window(self):
        help_button.config(state=DISABLED)
        window = Window(self)
        
    def write(self, text):
        self.console.update_idletasks()
        self.console.insert(tk.END, text)
        self.console.yview_pickplace("end")

con = TkConsole()
sys.stdout = con

...... Alles was jetzt ausgegeben wird landet in der TK-Ausgabe

if __name__ == "__main__":
   tk.mainloop()
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

Unter "einwandfrei" würde ich etwas anderes verstehen. GUI-Programme funktionieren nur, wenn sie dauerhaft im Mainloop laufen. Aus dem Code-Fragment kann man nicht wirklich herauslesen, was gemacht wird, ich befürchte aber, dass hier jemand versucht, den linearen Ablauf eines Normalen Programms in eine GUI hineinzuquetschen, was aber zwangsläufig zu Fehlern führt, weil so sind GUIs nicht gedacht.

Wenn irgendetwas im Hintergrund (parallel zur GUI) laufen soll, dann muß man sich mit Nebenläufiger Programmierung, Threading, Queues, etc auseinandersetzen.
Benutzeravatar
bi3mw
User
Beiträge: 11
Registriert: Mittwoch 19. Oktober 2022, 23:14

Das Problem hat sich gelöst. Ich habe einfach "self.console.update_idletasks()" durch "self.console.update()" ersetzt. Jetzt kommt auch unter Windows sofort die Ausgabe in die TK-Console. Im "normalen" Terminal läuft zwar alles einen Tick schneller, aber man kann halt nicht alles haben.
Antworten