ich habe eine Frage zum tkinter.filedialog.
Ich setze den filedialog zur Auswahl eines Verzeichnisses ein, ohne ansonsten mit Tkinter zu arbeiten (oder mich sonderlich damit auszukennen): Der Dialog ist halt super praktisch, um in einer App ohne GUI ein Verzeichnis komfortabel auszuwählen.
Die Auswahl des Verzeichnisses funktioniert beim ersten Aufruf des Dialogs noch.
Der Versuch, den Dialog (zum Wechsel des Verzeichnisses) mittels eines Tastatur-Shortcuts ein zweites Mal aufzurufen, scheitert aber mit der Fehlermeldung: "RuntimeError: main thread is not in main loop".
Leider verstehe ich nicht, was mir das genau sagen soll und wie ich es abstellen könnte.
Im Folgenden ein Auszug des betreffenden Codes:
Code: Alles auswählen
import datetime
import os
from pynput import keyboard
import tkinter as tk
from tkinter import filedialog
import winsound
COMBINATIONS = [
{keyboard.Key.f9},
{keyboard.Key.f10},
]
root = tk.Tk()
root.withdraw()
chosen_path = None
def choose_directory():
global chosen_path
_chosen_path = filedialog.askdirectory(
initialdir="D:\\",
title="Wähle Scan-Verzeichnis ..."
)
print(f'Scan-Verzeichnis: {_chosen_path}\n')
chosen_path = _chosen_path
choose_directory()
current = set()
def delete_last_scan():
list_of_files = []
for file in os.listdir(chosen_path):
if file.endswith('.tif'):
list_of_files.append(os.path.join(chosen_path, file))
if len(list_of_files) == 0:
return False
latest_file_fullpath = max(list_of_files, key=os.path.getctime)
filename = os.path.basename(latest_file_fullpath)
_datetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f'({_datetime}) Datei gelöscht: {filename}')
winsound.PlaySound(sound='trash.wav', flags=winsound.SND_FILENAME)
os.remove(path=latest_file_fullpath)
def on_press(key):
if any([key in COMBO for COMBO in COMBINATIONS]):
current.add(key)
if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
if key.name == 'f9':
delete_last_scan()
elif key.name == 'f10':
# choose_directory()
print('Die Funktion zum Wechsel des Verzeichnisses '
'produziert immer noch einen Fehler und ist daher '
'abgeschaltet.\n')
def on_release(key):
if any([key in COMBO for COMBO in COMBINATIONS]):
current.remove(key)
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
Über Hilfe würde ich mich sehr freuen.
Mit freundlichem Gruß,
Johannes