mainloop wird bei eigenem Thread nicht gestartet

Fragen zu Tkinter.
Antworten
moccajoghurt
User
Beiträge: 23
Registriert: Freitag 20. Juli 2012, 15:12

Hi,
folgender Code funktioniert bei mir nicht wie beabsichtigt:

Code: Alles auswählen

class loading_bar():
	
	def __init__(self):
		self.window = Tkinter.Tk()
		self.bar = Progressbar(self.window, length=200)
		
		self.bar.pack(expand=True, fill=Tkinter.BOTH)
			
		
		t = threading.Thread(target=self.start_bar)
		t.start()
		
	
	def start_bar(self):
		
		self.window.mainloop()
		
Es öffnet sich kein Fenster.

Wenn ich einfach nur

Code: Alles auswählen

self.start_bar()
aufrufe, dann öffnet sich das Fenster.

Wieso wird die mainloop mit eigenem Thread nicht gestartet?
Wäre dankbar über jeden Hinweis.

Gruß,
moccajoghurt
deets

GUI + multithreading = Geht normalerweise nicht.

Was nicht heisst, dass du nicht multiple threads in deinem Programm haben kannst. Aber der mainloop muss im main-thread sein (meistens, ausnahmen, regel, bilde einen satz), und du musst Timer oder Events benutzen. Tkinter kann nur ersteres, benutze die after-Funktion, um deinen Fortschritt abzufragen, der im Hintergrund-Thread berechnet wird.
moccajoghurt
User
Beiträge: 23
Registriert: Freitag 20. Juli 2012, 15:12

deets hat geschrieben:GUI + multithreading = Geht normalerweise nicht.

Was nicht heisst, dass du nicht multiple threads in deinem Programm haben kannst. Aber der mainloop muss im main-thread sein (meistens, ausnahmen, regel, bilde einen satz), und du musst Timer oder Events benutzen. Tkinter kann nur ersteres, benutze die after-Funktion, um deinen Fortschritt abzufragen, der im Hintergrund-Thread berechnet wird.
Ok gut zu wissen. Ich war nämlich doppelt verwirrt, weil es in einer anderen Klasse funktioniert hat.
Manchmal verwirrt mich Python. Gibt es noch andere Eigenheiten bei Python, die man kennen sollte, damit man nich ewig googlen muss, um dann festzustellen, dass es nicht am eigenen code liegt, sondern an der Beschaffenheit von bestimmten Modulen?
Bin auf dieses Problem bisher noch nicht gestoßen (habe bisher nur Java/C++ programmiert).
deets

ich glaube ehrlich gesagt nicht, dass python das problem ist. die sprache ist eigentlich ziemlich ueberraschungsfrei. und die probleme, die du hier anfuehrst, haben auch nichts mit python zu tun, sondern mit GUI-toolkits im allgemeinen bzw. tk im besondern.

und das du das mit java und C++ nicht hattest kann ich nicht glauben. bestenfalls hast du glueck gehabt immer nur rezepten gefolgt zu sein, die das problem umschifft haben. denn auch java swing und toolkits wie Qt, Cocoa, GTK und windows forms haben diese probleme. in allen muss man auf bestimmte art und weisen aus anderen threads in den main-thread reininjizieren, wenn man was an der GUI updaten will.
deets

in swing zb benutzt man

Code: Alles auswählen

SwingUtilities.invokeLater(new Runnable() { ... })
fuer sowas. wenn du das getan hast, dann ist das genau das, was den code in den ... in den main-thread injiziert.
moccajoghurt
User
Beiträge: 23
Registriert: Freitag 20. Juli 2012, 15:12

Kann auch sein, dass ich Glück hatte, bei swing habe ich mämlich nie

Code: Alles auswählen

SwingUtilities.invokeLater
genutzt. Gut, dann werde ich es so machen, wie du vorgeschlagen hast.
Antworten