Seite 1 von 1

Toplevel im Hintergrund öffnen

Verfasst: Mittwoch 27. April 2022, 17:03
von Fire Spike
Hallo Leute

In meiner GUI muss ich eine Variable zuweisen.

Code: Alles auswählen

self.data = load()
Das dauert allerdings mehrere Sekunden.
Deshalb möchte ich währenddessen eine Progressbar in einem Toplevel anzeigen, um zu zeigen das was läuft.

Code: Alles auswählen

    root = tk.Toplevel()
    ttk.Label(root, text=text).pack()
    progress_bar = ttk.Progressbar(root, mode="indeterminate", length=100)
    progress_bar.pack()
    progress_bar.start()
Wenn es fertig ist soll das Toplevel wieder schliessen.
Allerdings schaffe ich es nicht das Toplevel anzuzeigen ohne das Hauptfenster zu blockieren.
Könnt ihr mir bitte weiter helfen?

Re: Toplevel im Hintergrund öffnen

Verfasst: Mittwoch 27. April 2022, 21:34
von basti.gtr
Servus bin kein Profi aber ich denke du meinst das die zwei Fenster nicht übereinander lappen wenn sich das TopLevel() öffnet ? Das geht mit .winfo_x() und .winfo_width() um das TopLevel relativ zu deinem root Fenster zu verschieben. Vielleicht kann dir jemand anderes noch weiter helfen wie man das neue Fenster wirklich im Hintergrund öffnet

Re: Toplevel im Hintergrund öffnen

Verfasst: Mittwoch 27. April 2022, 21:38
von __blackjack__
@Fire Spike: Wie hast Du denn das Problem gelöst, dass der `load()`-Aufruf der mehrere Sekunden braucht, nicht die GUI blockiert?

Re: Toplevel im Hintergrund öffnen

Verfasst: Mittwoch 27. April 2022, 21:39
von Dennis89
Hallo,

vielleicht müsstest du dazu mehr Code zeigen.

Kann es sein, dass durch dein 'progress_bar.start()' die 'mainloop' nicht erreicht oder unterbrochen wird? Die sorgt dafür, dass das Hauptfenster sich immer wieder aktualisiert und auf das auf Ereignisse reagiert werden kann.

Grüße
Dennis

Re: Toplevel im Hintergrund öffnen

Verfasst: Mittwoch 4. Mai 2022, 19:47
von Fire Spike
@__blackjack__
Noch gar nicht. Meine überlegung war es multiprocessing für den load() aufruf zu nutzen. Das geht ja aber auch nicht da ich einen Rückgabewert brauche dem ich self.data zuweisen kann. Bin ich hier falsch?

Re: Toplevel im Hintergrund öffnen

Verfasst: Donnerstag 5. Mai 2022, 07:26
von Sirius3
Nicht, dass es bei Multiprocessing nicht auch Rückgabewert gäbe, aber die Logik ist falsch. `load` darf ja nicht warten, bis die Daten da sind, sondern muss sofort die Kontrolle an die mainloop zurückgeben.
Übliches Vorgehen ist, einen Hintergrundthread zu starten, der übermittelt per Queue den Fortschrittsstand, der in der GUI per after regelmäßig abgefragt wird und dann die Processbar aktualisiert.