Ich beschäftige mich mal wieder mit meinen Lieblingsbaustellen, die da lauten: Objektorientierung, Threads und Tkinter. Da es zu meiner Zeit (ist schon etwas her) im Informatikunterricht keine Objektorientierung gab, versuche ich mich nun als Autodidakt. Ich muss da noch einiges lernen...
Im folgenden Beispiel habe ich einen Coutdown-Timer geschrieben. Dieser nutzt als GUI Tkinter, treading zum ungestörten Runterzählen, und spielt am Ende in einem weiteren treading einen Sound ab. Das funktioniert!
Nun möchte ich aber das Feedback verbessern und unter Tk die aktuelle Countdown-Zeit im Label etwas formatierter anzeigen: nämlich als Minuten und Sekunden.
Jetzt kommt's: Dazu brauch ich aber am Besten die Zeitvariable self.cur_t aus Countdown (threading) wieder zurück in AppGUI!
Oder anders gefragt:Wie bekomme ich aus einem "untergeordneten" Thread wieder eine Variable zurück nach Tk? Wenn ich self.cur_t mit return zurückgebe, bricht die Schleife ab.
Ich hoffe, das war nicht zu unverständlich.
Vielen Dank schon mal.
Übrigens freue ich mich auch über jeden Tipp zu meinem Programm. Verbesserungsvorschläge jeder Art sind herzlich willkommen.
Code: Alles auswählen
from Tkinter import *
from time import *
import winsound
import threading
COUNTDOWNTIME = 10
class Playsound(threading.Thread):
def __init__(self,s):
threading.Thread.__init__(self)
self.s = s
def run(self):
for i in range(len(self.s)):
print "Playing sound:", self.s[i]
winsound.PlaySound(self.s[i],winsound.SND_PURGE)
class Countdown(threading.Thread):
def __init__(self, label, t, mb):
threading.Thread.__init__(self)
self.label = label # provides access to Tk widget
self.mb = mb # provides access to Tk widget
self.t = t # variable space limited to Countdown!!!
self.cur_t = t # current time
def run(self):
while self.cur_t > 0 and self.mb.entrycget(1,"label")=="Stop":
sleep(1) # wait a second
self.cur_t -= 1 # count down
#some output
print "t:", self.cur_t
self.label.config(text=str(self.cur_t))
if self.cur_t <= 0:
print "The Time is up!"
print
ps = Playsound([#"sound/0.wav",
#"sound/The time is up.wav",
"sound/chimes.wav"])
ps.start()
sleep(0.5)
self.mb.entryconfig(1,label="Start")
self.label.config(text=str(self.t))
class AppGUI:
def __init__(self,master):
self.t = COUNTDOWNTIME
self.run_button = "Start"
self.master = master
## GUI design #########################################################
self.mb = Menu(self.master) #menu bar
master.config(menu=self.mb) #to attach to root window
self.mb.add_command(label=self.run_button,
command=self.run_button_action)
self.label = Label(master,font=("Arial","30"))
self.label.pack()
self.label.config(text=self.t)
def run_button_action(self):
print "start/stop:", self.mb.entrycget(1,"label")
if self.mb.entrycget(1,"label")=="Start":
self.mb.entryconfig(1,label="Stop") #change label of 1st menu item
cd = Countdown(self.label, self.t, self.mb)
cd.start()
else:
print self.mb.entrycget(1,"label")
self.mb.entryconfig(1,label="Start")
sleep(1.1)
self.label.config(text=self.t)
def main():
root=Tk()
root.title("Countdown")
root.wm_geometry('170x50+200+200')
root.resizable(False,False)
root.deiconify()
app=AppGUI(root)
root.mainloop()
if __name__ == '__main__':
main()