Progressbar 100% funktioniert nicht

Fragen zu Tkinter.
Antworten
MarcNAV
User
Beiträge: 52
Registriert: Freitag 16. Mai 2014, 11:39

Hab auf die Schnelle nichts im Netz gefunden was mir helfen würde. Das Beispiel macht nicht sonderlich viel Sinn aber ich hätte gerne, dass er mir den Status der dosomething Funktion in einem horizontalen Ladebalken(0-100%) anzeigt. Was muss ich da abändern oder hinzufügen? Danke schonmal

Code: Alles auswählen

import Tkinter, ttk, shutil, glob


def dosomething(bar):


    bar.start()

    source= 'F:/Dateien/Test'

    target= 'F:/Dateien/Test/txts'

    files = glob.glob(path + '/*.txt')
    for file in files:

        shutil.move(file, target)


    bar.stop()



def main():

    root = Tkinter.Tk()

    b = Tkinter.Button(root, text = 'Run', width=25, command= lambda: dosomething(bar))
    b.grid(row=1, column=0)


    bar = ttk.Progressbar(root, maximum= 100, maximum = 100, orient='horizontal', length=200, mode='determinate')
    bar.grid(row=2, column=0)




    root.mainloop()


if __name__ == '__main__':
    main()
BlackJack

@MarcNAV: Du musst `start()` und `stop()` herausnehmen, das `maximum` auf die Anzahl der zu verschiebenden Dateien setzen und dann nach jedem verschieben den `value` aktualisieren. Dazu kommt noch das Problem das Deine Funktion nur kurz laufen darf, denn solange Deine Funktion etwas macht, kann die GUI-Hauptschleife nicht laufen und damit wird die GUI nicht neu gezeichnet und reagiert auch nicht auf den Benutzer. Da das verschieben, auch für eine einzelne Datei, potentiell ziemlich lange dauern kann, würde man das in einen eigenen Thread verschieben der dann die abgearbeiteten Dateinamen in eine Queue schreibt, welche vom GUI-Thread mit Hilfe der `after()`-Methode regelmässig geprüft wird und die dann den Fortschrittsbalken aktualisiert.
MarcNAV
User
Beiträge: 52
Registriert: Freitag 16. Mai 2014, 11:39

okay vielen Dank. Das ist dann doch komplizierter als ich dachte. Das ist mir auch aufgefallen, dass bei größeren Berechnungen die GUI einfriert. Dann bringt natürlich der Ladebalken nichts. Werd mich wohl erstmal mit Thread und Queue beschäftigen müssen. Kennt jemand ein einfaches, nachvollziehbares Beispiel für dieses Queue Modul? Finde nur unverständliche Beispiele.
BlackJack

@MarcNAV: Was findest Du denn konkret unverständlich? Du brauchst eine Queue und die Methoden `put()` und `get()`, eventuell das `get()` in der `get_nowait()`-Variante.
Antworten