Code wird nicht nacheinander abgearbeitet?

Fragen zu Tkinter.
Antworten
Sascha2019
User
Beiträge: 2
Registriert: Montag 23. September 2019, 14:46

Hallo Community! Bin neu hier im Forum und suche als Anfänger nach erfolgloser Selbsthilfe und Foren-Suchen Hilfe bei folgendem Problem:

Folgender Code soll nach erfolgter Eingabe eines Wunsch-Ordners unter Windows einen Ordner erstellen und Videodateien von einer bereits vorher angegeben Quelle dorthin kopieren. Mit der <Return> Taste soll aber VOR dem Kopieren das Eingabefeld gelöscht und stattdessen diverser Infotext ausgegeben werden. Das passiert alles soweit, allerdings in der falschen Reihenfolge. D.h. der Infotext wird im Fenster erst nach dem Kopieren der Dateien angezeigt. Woran kann das liegen? Braucht Ihr Profis den ganzen Programm-Code zur Fehlersuche? Wäre sehr viel zu lesen..... Bin für jeden Tipp dankbar, komme selbst nicht mehr weiter.

Hier der Code-Ausschnitt. Wie gesagt funktioniert das Ganze soweit, nur die Reihenfolge passt nicht. Zuerst wird os.mkdir ... und shutil.copy2 .... erledigt, dann die labels und entrys geändert, zumindest wirds so im Fenster angezeigt :( Hoffe, ich konnte mich verständlich machen :roll:

if videos_vorhanden > 0:
label_Schritt2_fertig.configure(text="Videos vorhanden: Ja")
label_Eingabefeld_Videordner = Label(fenster,
text="Erstelle Ordner in .../Videos/Projekte/",
bg='WhiteSmoke', fg='black', font=('Arial', 12))
label_Eingabefeld_Videordner.grid(row=0, column=0, padx=5, pady=50, sticky="e")
Eingabefeld_Videoordner = Entry(fenster, bg='white', fg='black', font=('Arial', 12),
width=30)
Eingabefeld_Videoordner.grid(row=0, column=1, padx=0, pady=12, sticky="w")
Eingabefeld_Videoordner.get()

def EingabeVideoordner(Eingabe_Videoordner):
Eingabe_Videoordner = Eingabefeld_Videoordner.get()
Videoordner = ("C:/Users/Sascha Nolte/Videos/Projekte/" + Eingabe_Videoordner
Eingabefeld_Videoordner.after(0, Eingabefeld_Videoordner.destroy)
label_Schritt2_fertig.configure(
text=("Kopiere " + str(videos_vorhanden) + " Videodateien nach: " + str(
Videoordner) + " ...bitte warten..."))
label_Eingabefeld_Videordner.configure(
text=("Kopiere mp4s nach: " + str(Videoordner)))
try:
os.mkdir(Videoordner)
for f in glob.glob(os.path.join(Ordner, '*.mp4')) :
shutil.copy2(f, Videoordner)
label_Schritt2_fertig.configure(
text=str(videos_vorhanden) + " Videodateien kopiert!")[/color]

except:
messagebox.showerror('Hoppla!', 'Fehler beim Kopieren!\n Eingabe überprüfen!')

Eingabefeld_Videoordner.bind("<Return>", EingabeVideoordner)


else:
label_Schritt2_fertig.configure(text="Videos vorhanden: Nein")
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die Code-Tags benutzen, damit man den Code entziffern kann.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Erst mal zum Code: 8 Ebenen sind eindeutig zu viele. Ich weiß nicht, was Du sonst noch da stehen hast, aber versuche mehr Funktionen zu schreiben.
Apropos Funktionen: die sollten immer auf oberster Ebene stehen und nicht irgendwo tief verschachtelt. Funktionen sollten auch alles, was sie brauchen, über ihre Argumente bekommen, also neben Eingabe_Videoordner auch label_Schritt2_fertig.

Zur Namensschreibweise: Variablennamen und Funktionsnamen werden klein_mit_unterstrich geschrieben. Funktionen sollten eine Tätigkeit beschreiben, Du benutzt `EingabeVideoordner` und `Eingabe_Videoordner` die leicht verwechselt werden können, wobei das eine eigentlich `kopiere_videodateien` und die andere `videoordner` heißen sollte.

Ein `Eingabefeld_Videoordner.get()` ohne dass man etwas mit dem Rückgabewert macht, ist überflüssig.
Strings stückelt man nicht per + zusammen, sondern nimmt Format-Strings. Pfade stückelt man erst recht nicht mit + zusammen, sondern nimmt pathlib.Path. So wichtige Konstanten wie Pfade sollten nicht mitten im Code als literale Strings stehen, sondern als KONSTANTEN am Anfang der Datei.
Niemals nakte Excepts verwenden, weil die wirklich jeden Fehler, auch viele Programmierfehler abfangen und bei Dir durch eine nichtsagnde Meldung ersetzen. Fange nur die Exception ab, die Du wirklich behandeln willst.

Letztlich machst Du den selben Fehler, den jeder Anfänger bei GUI-Programmierung mindestens einmal macht. Fenster werden nur aktualisiert, wenn die Funktion in die Hauptschleife zurückkehrt. Langlaufende Programmteile, wie kopieren, müssen in einen Thread ausgelagert werden, und über eine Queue, die per after abgefragt wird, Status-Updates übermittelt werden.
Sascha2019
User
Beiträge: 2
Registriert: Montag 23. September 2019, 14:46

Ich bedanke mich schon mal für die ausführliche Antwort und die hilfreichen Hinweise. Die empfohlenen Optimierungen werde ich umsetzen. Jetzt ergoogle ich mir erstmal das nötige Wissen ums Thread-Handling, und versuche das selbst gebacken zu bekommen. Python-Tutorials gibts ja wirklich mehr als genug , aber hier kam ich einfach nicht weiter - Danke.
Antworten