Toplevel im Hintergrund öffnen

Fragen zu Tkinter.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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?
basti.gtr
User
Beiträge: 7
Registriert: Montag 11. April 2022, 11:08

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
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Wie hast Du denn das Problem gelöst, dass der `load()`-Aufruf der mehrere Sekunden braucht, nicht die GUI blockiert?

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Benutzeravatar
Dennis89
User
Beiträge: 1376
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

@__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?
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten