tkMessageBox, Timer (threading),... [gelöst]

Fragen zu Tkinter.
Antworten
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Hallo euch alle!

Ich hätte gerne einen anderen Titel für den Thread gewählt, aber da ich nicht weiß, wo ich meinen Fehler habe (oder nicht genau), fehlt mir natürlich auch der Titel... :oops: Sorry.

Also, ich habe nachstehenden, kleinen Code, der nichts anderes macht, als einen Timer (Countdown) zu starten. Wenn dieser Fertig ist, möchte ich eine Meldung dazu ausgeben.
Der Countdown scheint auch gut zu funktionieren, ich sehe durch eine Ausgabe von "print 'fertig'" auch, dass es so ist.

Leider hängt aber die Sache mit der MessageBox...
Ich wäre sehr dankbar, wenn mir jemand einen Tip geben könnte, warum es nicht funktioniert.

Code: Alles auswählen

import Tkinter as ti
import tkMessageBox as tkm
import sys as s
import threading as th

class RootWin(object):
	def __init__(self):
		self.root = ti.Tk()
		self.frame = ti.Frame(self.root)
		self.lbl = ti.Label(self.frame, padx=15, pady=15, text="Please enter countdown time!")
		self.entry = ti.Entry(self.frame)
		self.btn_go = ti.Button(self.frame, padx=8, pady=8, text="Go!", command=self.countdown)
		self.btn_exit = ti.Button(self.frame, padx=8, pady=8,text="Exit", command=self.exit_app)
		
		self.frame.pack()
		self.lbl.pack()
		self.entry.pack(padx=15)
		self.btn_go.pack()
		self.btn_exit.pack()
		
		self.root.mainloop()
		
	def countdown(self):
		try:
			timetocount = float(self.entry.get())
			print timetocount
			t = th.Timer(timetocount, self.finito).start()
		except:
			tkm.showwarning(
			"Error",
			"Please enter proper value!\nExample:23 or 23.5"
			)
	
	def exit_app(self):
		s.exit(0)
		
	def finito(self):
		print "Fertig"
		
		# Diese tkMessageBox funktioniert nicht.
		# Irgendwie hängt die Sache hier.
		# ???
		tkm.showwarning(
			"DONE",
			"Finished. Time expired!"
			)	
	
myApp = RootWin()
Zuletzt geändert von C4S3 am Montag 15. Januar 2007, 15:18, insgesamt 1-mal geändert.
Gruß!
BlackJack

GUIs mögen in der Regel gar nicht wenn man sie von verschiedenen Threads aus benutzt.

Schau Dir mal die `after()`-Methode von Tkinter-Widgets als Alternative an.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Danke für den Tip mit "after()"!

Es funktioniert jetzt, auch wenn es sich meinem Verständnis ein wenig entzieht.

Hier das neue Script:

Code: Alles auswählen

import Tkinter as ti
import tkMessageBox as tkm
import sys as s

class RootWin(object):
	def __init__(self):
		self.root = ti.Tk()
		self.frame = ti.Frame(self.root)
		self.lbl = ti.Label(self.frame, padx=15, pady=15, text="Please enter countdown time!")
		self.entry = ti.Entry(self.frame)
		self.btn_go = ti.Button(self.frame, padx=8, pady=8, text="Go!", command=self.countdown)
		self.btn_exit = ti.Button(self.frame, padx=8, pady=8,text="Exit", command=self.exit_app)
				
		self.frame.pack()
		self.lbl.pack()
		self.entry.pack(padx=15)
		self.btn_go.pack()
		self.btn_exit.pack()
		
		self.root.mainloop()
		
	def countdown(self):
		try:
			timetocount = float(self.entry.get())
			print timetocount
			
			# THIS LINE IS NEW
			self.btn_go.after(int(timetocount*1000), self.finito)			
			
		except:
			tkm.showwarning(
			"Error",
			"Please enter proper value!\n\nExample:23 or 2.3\n\nInteger or Floatvalue required!"
			)
	
	def exit_app(self):
		s.exit(0)
		
	def finito(self):
		print "Fertig"
	
		# WORKS NOW, THREADING MODULE REMOVED.
		tkm.showwarning(
			"DONE",
			"Finished. Time expired!"
			)

if __name__ == "__main__":
	myApp = RootWin()
Wobei ich dazusagen muss, dass ich das ganze noch nicht ganz verstehe, da ich jetzt den "CountDown" an den "GO-Button" binde, wenn ich es richtig verstehe.
Jedenfalls finde ich gut, dass after mit Millisekunden arbeitet.
Danke!
Gruß!
Antworten