利用 threading:
首先 initialize threading: gobject.threads.init(), 注意 threading 的结束, 所以最后 gtk.main() 跳出的时候要设定 threading 的属性 quit 为 True
主线程内不可有 block 的行为, 如 while (..), 动态的改变 label text 则是在 MyThread.update_label 实现, 在 MyThread,run() is alive 时候, 调用
gobject.idle_add(self.update_label, output)
这可使得 label 动态的 perform myfile 的内容.
import pygtk pygtk.require('2.0') import gtk import commands import time import gobject import threading gobject.threads_init() class MyThread(threading.Thread): def __init__(self, label): super(MyThread, self).__init__() self.label = label self.quit = False self.clicked = 0 self.stop = 0 self.func = None def update_label(self, counter): self.label.set_text(counter) return False def set_clicked(self, clicked): self.clicked = clicked return False def set_func(self, fn): self.func = fn def run(self): counter = 0 while not self.quit: if self.clicked: counter += 1 command = '''cat /tmp/myfile ''' status,output = commands.getstatusoutput(command) else: output = "no ready..." gobject.idle_add(self.update_label, output) time.sleep(0.1) class base: def clicked(self, event): self.t.clicked = 1 def __init__(self): win=gtk.Window(gtk.WINDOW_TOPLEVEL) win.set_size_request(500, 50) win.set_title("sample") win.show() win.connect("destroy", lambda _: gtk.main_quit()) vbox=gtk.VBox(False,0) win.add(vbox) hbox= gtk.HBox(False,0) vbox.add(hbox) txt= gtk.Entry() txt.set_text("") hbox.pack_start(txt,True,True,0) self.label= gtk.Label() vbox.pack_start(self.label,True,True,0) self.t = MyThread(self.label) self.t.start() button= gtk.Button() button.set_label("Click me!!") # the following passes button and a click event to self.btn button.connect("clicked", self.clicked) hbox.pack_start(button,True,True,0) win.show_all() if __name__=="__main__": BASE=base() gtk.main() BASE.t.quit = True