[geklärt] Thread fehlermeldung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

Hallo alle zusammen :D

Hoffe das ich im richtigen Topic bin da auch ein Tkinter-fehler mit dabei zu sein scheint.

Das unten aufgeführte Programm funktioniert soweit Problemlos nur wenn
ich das Fenster schließe kommen die darunter aufgeführte Fehler.

Mir ist nicht ganz klar warum. Muss ich den Thread beenden ?
aus der lib bin ich absolut nicht schlau geworden. "Dazu scheine ich noch zu wenig ahnung zu haben"

Code: Alles auswählen

# Uhr.py

from Tkinter import *
from time import *
from threading import *
from string import *

class Uhr(Thread):

	def __init__(self):
		Thread.__init__(self)
		
		self.root = Tk()
		self.text = StringVar()
		self.label = Label(self.root,textvariable=self.text,font=("ARIAL",20),width=10,height=2)
		self.label.pack()
		self.start()
		self.root.mainloop()
	
	def run(self):
		while 1:
			self.label.config(text=self.text)
			self.text.set(split(asctime())[3])
			sleep(0.5)

		
a = Uhr()

Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 460, in __bootstrap
self.run()
File "C:\Python25\Uhr.py", line 22, in run
self.label.config(text=self.text)
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1197, in configure
return self._configure('configure', cnf, kw)
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1188, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
TclError: invalid command name ".12285192"



Programiere noch nicht lange :oops:
vielen Dank im voraus für eure Hilfe.

mfg
Smokie_joe
Zuletzt geändert von Smokie_joe am Dienstag 14. November 2006, 21:50, insgesamt 1-mal geändert.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi Smokie_joe,
ich bin mir nicht sicher, aber wenn du das Tk-Fenster schließt, beendest du den mainloop, run läuft aber doch weiter, oder? Da in run self.label configuriert werden soll, dieses jedoch nicht mehr existiert, gibt's nen error...
Du könntest mal versuchen, statt "while 1" die Existenz von self.root zu testen.
Wie ich grade selbst gelernt habe, ist es, vor allem bei mehreren Threads, evtl. besser den Thread rauszulassen, und zu schreiben:

Code: Alles auswählen

    def run(self):
            self.label.config(text=self.text)
            self.text.set(split(asctime())[3])
       # hier dein if einbauen
            self.root.after(500,self.run) #500millisek.
Gruß, jj
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

Super danke so ein Denkansatz hat mir gefehlt ;)

Habe den Code jetzt wie folgt umgebaut u. es Funktioniert.


Code: Alles auswählen

# Uhr.py

from Tkinter import *
from time import *
from threading import *
from string import *

class Uhr(Thread):

	def __init__(self):
		Thread.__init__(self)
		
		self.root = Tk()
		self.text = StringVar()
		self.label = Label(self.root,textvariable=self.text,font=("ARIAL",20),width=10,height=2)
		self.label.pack()
		self.start()
		self.root.mainloop()
	
	def run(self):
		
		self.label.config(text=self.text)
		self.text.set(split(asctime())[3])
			
		if self.root.winfo_exists() == 1:

			self.root.after(500,self.run) #500millisek.

		
a = Uhr()
Achja wie meinst du das genau mit Thread rauslassen das habe ich nicht ganz Verstanden. :roll:

Nochmals Danke.

mfg
Smokie_joe
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi smokie_joe, so gehts ohne threading:

Code: Alles auswählen

from Tkinter import * 
from time import asctime


class Uhr: 

    def __init__(self):         
        self.root = Tk() 
        self.text = StringVar() 
        self.label = Label(self.root,textvariable=self.text,font=("ARIAL",20),width=10,height=2) 
        self.label.pack()
        self.run()
        self.root.mainloop() 
    
    def run(self):
        self.text.set(asctime().split()[3])
        if self.root.winfo_exists() == 1: 
            self.root.after(500,self.run)

a = Uhr()
Bei run() hätte ich die ersten beiden Zeilen vertauscht, ist ja schlauer die zeit zu aktuallisieren und zu schreiben, als nach dem Aktuallisieren erst bis zum nächsten Aufruf mit dem label.config() zu warten, aber dasbrauchst du garnicht, da textvariablen automatisch geändert werden. Zudem sind die meisten im Modul String bereitgestellten Funktionen bereits als Stringmethoden vorhanden, sodass man das hier auch nicht importieren muss.
Gruß, jj
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

cool thx nochma f. die hilfe.

:D :D :D :D :D :D :D
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Kein Problem :lol:
Antworten