Windows でスレッドと PyGTK に問題があります。PyGTK FAQ (および私自身の実験) によると、子スレッドから GUI を確実に更新する唯一の方法は、gobject.idle_add
関数を使用することです。ただし、この関数がいつ呼び出されるかは保証できません。gobject.idle_add
次の行が、それが指す関数の後に呼び出されることを保証するにはどうすればよいですか?
非常に単純で不自然な例:
import gtk
import gobject
from threading import Thread
class Gui(object):
def __init__(self):
self.button = gtk.Button("Click")
self.button.connect("clicked", self.onButtonClicked)
self.textEntry = gtk.Entry()
self.content = gtk.HBox()
self.content.pack_start(self.button)
self.content.pack_start(self.textEntry)
self.window = gtk.Window()
self.window.connect("destroy", self.quit)
self.window.add(self.content)
self.window.show_all()
def onButtonClicked(self, button):
Thread(target=self.startThread).start()
def startThread(self):
#I want these next 2 lines to run in order
gobject.idle_add(self.updateText)
print self.textEntry.get_text()
def updateText(self):
self.textEntry.set_text("Hello!")
def quit(self, widget):
gtk.main_quit()
gobject.threads_init()
x = Gui()
gtk.main()