Tkinter schläft

Fragen zu Tkinter.
Antworten
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ich weiß jetzt echt nicht mehr weiter, immer wenn ich den Code ausführe und ein Verzeichnis scannen will schaltet das Label erst den Text um wenn das Scannen schon fertig ist. Hier ist der Code:

Code: Alles auswählen

import tkinter
import tkinter.filedialog as filedialog
import tkinter.messagebox as messagebox
import memorymaker

window = tkinter.Tk()
window.title('Memory Maker')

tkinter.Label(window, text='Startus:').grid(row=0, column=0, sticky='e')
startuslabel = tkinter.Label(window, text='Keine Aktionen verbleibend', width=40, fg='black', bg='red', font=('bold'))
startuslabel.grid(row=0, column=1, sticky='w')

def appendpath():
    path = filedialog.askdirectory()
    startuslabel.config(text='Verzeichnis wird Gescannt.')
    memorymaker.scandirectory(path)
    messagebox.showinfo('Info', 'Verzeichnis wurde gescannt.')
    startuslabel.config(text='Keine Aktionen verbleibend')

menubar = tkinter.Menu(window)
filemenu = tkinter.Menu(menubar)
filemenu.add_command(label='Verzeichnis Scannen', command=appendpath)
filemenu.add_command(label='Beenden', command=exit)

menubar.add_cascade(label='Datei', menu=filemenu)
window.config(menu=menubar)

tkinter.mainloop()
Was mache ich Falsch?

EDIT: 500 Beitrag
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Wenn Deine Funktion läuft kann die Ereignisschleife von Tkinter nicht laufen und damit auch die GUI nicht aktualisieren.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Aber ich Aktualisiere ihn doch bevor das abläuft. Wie kann ich das hinkriegen das Tkinter erste den Inhalt des Labels ändert und danach die Funktion aufruft?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Du veränderst Werte aber aktualisierst die GUI nicht. Wenn das bei jeder kleinen Veränderung passieren würde, wäre das ganze sicher unterträglich langsam. Ruf mal nach den Änderungen `update_idletasks()` auf.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Danke, geht jetzt so wie ich's haben wollte. :D
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Dann hab ich noch ne Frage:
Angenommen der Code würde auch ohne den Befehl funktionieren, sollte ich dann den Befehl trotzdem verwenden oder nicht?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Nö, wozu denn? Du musst die Methode nur dann aufrufen wenn ein von dir durchgeführter Prozess länger dauert und dadurch die GUI blockiert wird, da die Tk-Mainloop nicht weitergeführt werden kann. Ansonsten hast du einen überflüssigen Funktionsruf in deinem Programm, welcher die GUI neuzeichnet, stört aber nicht sonderlich. Von der unötigen Nutzung von der Methode "update" ist allerdings gänzlich abzuraten.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ich meine ja nur weil ich einmal drei Tk() aufgerufen hab (war keine Problem), und dann kam der Satz:

Code: Alles auswählen

Nur weil was bei dir Funktioniert muss es bei anderen nicht auch Funktionieren
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das ist doch auch was anderes, dort erschaffst du mehrere Anwendungen die im selben Prozess agieren und allein dadurch schon die _default_root überschreibst. Die kann zB. bei einem tkinter.Image schonmal dafür sorgen das ein falsches master-Objekt übermittelt wird und das Image auf dem einen Fenster verschindet obwohl man ein anderes geschlossen hat. Das ist zwar nur ein absehbares Ereignis was nur in Tkinter passieren kann, aber diese mehrfach Benutzung von Tk()-Fenstern sollte man nicht nutzen.

Hier zeichnest du die GUI nur neu und das mit einer dafür vorgesehenen Methode, also abgesehen von einem eventuellen Performance-Problem bei zu häufigen neuzeichnen (was ja heute ausgesprochen selten ist) sollte es dort kein Problem geben.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten