Seite 1 von 1

Tkinter schläft

Verfasst: Samstag 14. Mai 2011, 22:00
von Py-Prog
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

Re: Tkinter schläft

Verfasst: Samstag 14. Mai 2011, 22:04
von BlackJack
@Py-Prog: Wenn Deine Funktion läuft kann die Ereignisschleife von Tkinter nicht laufen und damit auch die GUI nicht aktualisieren.

Re: Tkinter schläft

Verfasst: Sonntag 15. Mai 2011, 13:43
von Py-Prog
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?

Re: Tkinter schläft

Verfasst: Sonntag 15. Mai 2011, 17:35
von 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.

Re: Tkinter schläft

Verfasst: Montag 16. Mai 2011, 18:53
von Py-Prog
Danke, geht jetzt so wie ich's haben wollte. :D

Re: Tkinter schläft

Verfasst: Dienstag 17. Mai 2011, 15:52
von Py-Prog
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?

Re: Tkinter schläft

Verfasst: Dienstag 17. Mai 2011, 16:33
von Xynon1
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.

Re: Tkinter schläft

Verfasst: Dienstag 17. Mai 2011, 16:39
von Py-Prog
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

Re: Tkinter schläft

Verfasst: Dienstag 17. Mai 2011, 17:00
von Xynon1
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.