Nach mainloop code ausführen

Fragen zu Tkinter.
Antworten
Zello
User
Beiträge: 7
Registriert: Sonntag 4. März 2007, 15:12

Montag 3. März 2008, 22:03

Hi,
ich habe folgendes Problem mit TkInter:
Ich habe nen Programm geschrieben, dass während seiner Ausführung nen Fenster öffnet.
Jetzt will ich das Programm erweitern und muss dazu nach dem ausführen von mainloop noch code ausführen.
Vereinfacht also:

Code: Alles auswählen

from Tkinter import *
import thread
root=Tk()
but=Button(root,text="blub")
but.pack()
root.mainloop()
print "huhu"
Da hab ich natürlich als erstes an threads gedacht und dass geschrieben:

Code: Alles auswählen

class Gui(Thread):
    def __init__(self):
        Thread.__init__(self)
    def run(self):
        root=Tk()
        but=Button(root,text="blub")
        but.pack()
        root.mainloop()
yada = Gui()
yada.start()
print "huhu"
Wenn ich das ganze aus der Idle raus starte, wird das Huhu ausgegeben, aber alles schmiert ab.
Wenn ich das Programm, wie ja bei Tkinter üblich, aus der Commandline starte, wird das Huhu nicht ausgegeben, allerdings schmiert auch nichts ab.
Wo liegt da mein Fehler?

Kann ich das Starten der mainloop auch ohne eine Klasse, die von Thread erbt, in einem eigenen Thread realisieren?
Hatte an

Code: Alles auswählen

thread.start_new_thread(self.mainloop()) 
gedacht.
Ich hoffe mal auf schnelle Hilfe,
Zello
BlackJack

Dienstag 4. März 2008, 08:20

Du solltest `threading.Thread` verwenden, sonst werden nämlich alle Threads beendet wenn der Hauptthread am Ende ist, egal ob die anderen Threads noch etwas zu tun haben, oder nicht.

Dann müsste es an sich funktionieren, allerdings darfst Du in dem Code, der das ``print 'huhu'`` ersetzt, nicht auf die GUI zugreifen! GUIs mögen das nicht, wenn man aus einem anderen Thread auf sie zugreift ausser dem, in dem die `mainloop()` läuft.

Falls der Code also mit der GUI zu tun hat, schau Dir mal die `after()`-Methode auf Widgets an.
Zello
User
Beiträge: 7
Registriert: Sonntag 4. März 2007, 15:12

Dienstag 4. März 2008, 09:36

Danke erstmal.
Da der Code mit der Gui zu tun hat (genauer:er malt noch einen zweiten Graphen auf eine canvas), probier ich mal, ob ich das mit after() hinkriege.
Greetz, Zello
Antworten