command Befehl schritt für schritt ausführen

Fragen zu Tkinter.
Antworten
Sans
User
Beiträge: 19
Registriert: Dienstag 28. September 2010, 16:31

Hi,
ich arbeite mich gerade in tkinter rein, habe aber nun folgendes Problem:

Mit Druck auf den Button soll natürlich der in command angegebene Befehl ausgeführt werden. In der dafür vorgegebenen Definition verwende ich aber eine for i in range Schleife, die in jedem Schritt den eine Variable erhöht und über configure als Text in einem Label ausgibt. Nun möchte ich aber jeden einzelnen Schritt sehen. Momentan ist es so, dass das Programm die ganze Schleife ablaufen lässt, um dann das ENDERGEBNIS auszugeben. Ich möchte die Änderung aber "live miterleben".



Kann mir jemand helfen?

Code: Alles auswählen

import sys
import tkinter as TK
import math

def countup():
   for i in range(20000):
    global z  
    z=z+1
    counter.configure(text=str(z))      
   
#Fenster
fenster=TK.Tk()


#Buttons
count=TK.Button(fenster, text="Count", command= countup)
count.pack()

#Labels
z=0
counter=TK.Label(fenster, text="Press 'Count' to continue")
counter["bg"]="#ff0000"
counter.pack()

#loop
fenster.mainloop()
Danke
Sans
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Du musst dad Frame-, Canvas- oder das Toplevel-Widget immer eine Aktualisierung erzwingen, wenn du in einem Schleifenkörper bist, da bei einer Schleife die Mainloop nicht aufgerufen wird.

Für diese Möglichkeit gibt es die Methoden "update" und "update_idletasks".
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Sans
User
Beiträge: 19
Registriert: Dienstag 28. September 2010, 16:31

ok, aber wie baue ich das ein, als einfaches

Code: Alles auswählen

update_idletask()
funktionierts nicht, "the global name is not defined", mit TK davor wirds auchnicht besser.

Danke
Sans
BlackJack

Das sind Methoden auf `Tkinter`-Widgets.
Sans
User
Beiträge: 19
Registriert: Dienstag 28. September 2010, 16:31

Also was muss ich machen?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Wenn du mit den Begriffen "Widget" und "Methode" nichts anfangen kannst, solltest du dir mal etwas Zeit für Lektüre nehmen: http://infohost.nmt.edu/tcc/help/pubs/tkinter/
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Sans

Hier etwas zum austesten:

Code: Alles auswählen

import sys
import tkinter as TK
import math

def countup():
   for i in range(20000):
    global z  
    z=z+1
    counter.configure(text=str(z))
    counter.update_idletasks()    
   
#Fenster
fenster=TK.Tk()


#Buttons
count=TK.Button(fenster, text="Count", command= countup)
count.pack()

#Labels
z=0
counter=TK.Label(fenster, text="Press 'Count' to continue")
counter["bg"]="#ff0000"
counter.pack()

#loop
fenster.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Sans
User
Beiträge: 19
Registriert: Dienstag 28. September 2010, 16:31

Danke wuf, funktioniert.
numerix hat geschrieben:Wenn du mit den Begriffen "Widget" und "Methode" nichts anfangen kannst, solltest du dir mal etwas Zeit für Lektüre nehmen: http://infohost.nmt.edu/tcc/help/pubs/tkinter/
Ich weiß was Widgets und Methods sind, aber mit
Das sind Methoden auf `Tkinter`-Widgets.
kann ich nichts anfangen, jetzt bin ich schlauer^^

sans
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Das sind Methoden auf `Tkinter`-Widgets.
hoert sich an, als wenn es eine Methode auf ein Widget ist,

hier eine gute Beschreibung aus dem NewMexicoTech Dokument:


25. Universal widget methods

The methods are defined below on all widgets. In the descriptions, w can be any widget of any type.

w.update()
This method forces the updating of the display. It should be used only if you know what you're doing,
since it can lead to unpredictable behavior or looping. It should never be called from an event callback
or a function that is called from an event callback.

w.update_idletasks()
Some tasks in updating the display, such as resizing and redrawing widgets,
are called idle tasks because they are usually deferred until the application has
finished handling events and has gone back to the main loop to wait for new events.
Antworten