Seite 1 von 1
mainloop wird bei eigenem Thread nicht gestartet
Verfasst: Dienstag 31. Juli 2012, 22:00
von moccajoghurt
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
aufrufe, dann öffnet sich das Fenster.
Wieso wird die mainloop mit eigenem Thread nicht gestartet?
Wäre dankbar über jeden Hinweis.
Gruß,
moccajoghurt
Re: mainloop wird bei eigenem Thread nicht gestartet
Verfasst: Dienstag 31. Juli 2012, 22:02
von 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.
Re: mainloop wird bei eigenem Thread nicht gestartet
Verfasst: Dienstag 31. Juli 2012, 22:22
von moccajoghurt
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).
Re: mainloop wird bei eigenem Thread nicht gestartet
Verfasst: Dienstag 31. Juli 2012, 22:28
von 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.
Re: mainloop wird bei eigenem Thread nicht gestartet
Verfasst: Dienstag 31. Juli 2012, 22:29
von deets
in swing zb benutzt man
fuer sowas. wenn du das getan hast, dann ist das genau das, was den code in den ... in den main-thread injiziert.
Re: mainloop wird bei eigenem Thread nicht gestartet
Verfasst: Dienstag 31. Juli 2012, 22:34
von moccajoghurt
Kann auch sein, dass ich Glück hatte, bei swing habe ich mämlich nie
genutzt. Gut, dann werde ich es so machen, wie du vorgeschlagen hast.