Threading & Open File Dialog
Verfasst: Montag 30. Mai 2022, 07:41
Hi, ich habe ein Problem mit Threading. In meiner Oberfläche (Tkinter) habe ich diverse Buttons. Über einen Button soll ein File Dialog geöffnet werden, worüber dann Dateien eingelesen werden können. Beim Öffnen wird automatisch ein separates Skript ausgeführt, um diese Daten zu bereinigen, was einige Zeit in Anspruch nimmt. Wenn man nun, während die Bereinigung durchläuft, andere Buttons anklicken möchte, gibt die Oberfläche keine Rückmeldung. Direkt dachte ich an Threading, damit die Bereinigung sowie die Oberfläche parallel berechnet werden können. Das habe ich implementiert und funktioniert, allerdings wird der Open File Dialog direkt beim Starten der GUI geöffnet und nicht erst beim Button Klick. Aktuell sieht der relevante Code so aus:
Button zum Öffnen eines Open File Dialogs
Methode zum Öffnen eines Open File Dialogs
Mein erster Gedanke: Vielleicht startet der Open File Dialog direkt mit, da das Starten des Threads bei der Initialisierung des Buttons mit ausgeführt wird. Daher hab ich den Thread direkt mit in die "browse_files" Methode implementiert gehabt. Zwar wurde der Dialog dann nicht direkt zu Beginn ausgeführt, allerdings funktionierte das Threading nicht mehr.
Mein zweiter Gedanke: Vielleicht muss ich die gesamte Oberfläche in einen eigenen Thread packen, damit der erste Gedanke funktionieren kann. Aber eigentlich läuft ja meines Wissens nach alles, was nicht explizit einem Thread zugewiesen wird, auf dem Main-Thread, daher würde das auch keinen Sinn ergeben. Ein schnelles ausprobieren hat gezeigt, dass auch das nicht die Lösung ist.
Hat jemand von euch einen Hinweis für mich oder Ideen, wie der File Dialog erst bei Klick auf den Button angezeigt wird und zugleich der Rest der GUI bedienbar bleibt?
Besten Dank & liebe Grüße
Button zum Öffnen eines Open File Dialogs
Code: Alles auswählen
open_file_button = Button(main_window, image=open_button_enabled, width=200, borderwidth=0, command=threading.Thread(target=browse_files).start())
Code: Alles auswählen
def browse_files():
global df
file = filedialog.askopenfilename(initialdir="/", title="Select a file",
filetypes=(("Excel files", "*.xlsx*"), ("CSV files", "*.csv")))
if file is not None and file.endswith(".xlsx"):
df = pd.read_excel(f"{file}", sheet_name=None)
df = clean_dataframe(df)
if file is not None and file.endswith(".csv"):
df = pd.read_csv(f"{file}", encoding="utf-8")
df = clean_dataframe(df)
Mein zweiter Gedanke: Vielleicht muss ich die gesamte Oberfläche in einen eigenen Thread packen, damit der erste Gedanke funktionieren kann. Aber eigentlich läuft ja meines Wissens nach alles, was nicht explizit einem Thread zugewiesen wird, auf dem Main-Thread, daher würde das auch keinen Sinn ergeben. Ein schnelles ausprobieren hat gezeigt, dass auch das nicht die Lösung ist.
Hat jemand von euch einen Hinweis für mich oder Ideen, wie der File Dialog erst bei Klick auf den Button angezeigt wird und zugleich der Rest der GUI bedienbar bleibt?
Besten Dank & liebe Grüße