有人可以给我一个以这种方式涉及线程的简单示例。
我的代码的问题是,当我单击按钮One时,GUI冻结直到完成。我希望在执行def时按钮保持响应。我该如何解决?
class fun: wTree = None def __init__( self ): self.wTree = gtk.glade.XML( "ui.glade" ) dic = { "on_buttonOne" : self.one, "on_buttonTwo" : self.two, } self.wTree.signal_autoconnect( dic ) gtk.main() def sone(self, widget): time.sleep(1) print "1" time.sleep(1) print "2" time.sleep(1) print "3" def stwo(self, widget): time.sleep(1) print "4" time.sleep(1) print "5" time.sleep(1) print "6" do=fun()
求您了,帮帮我。
使用gtk时,它将运行一个主循环,并将您想做的 所有事情 安排为gtk循环的事件。您不需要线程即可执行任何操作。
这是一个完整的,完整的,随时可以运行的示例,用于glib.timeout_add执行您想要的操作。
glib.timeout_add
请注意,单击两个按钮(或单击一个按钮多次)不会冻结gui,并且所有操作都是“同时”发生的…
import gtk import glib def yieldsleep(func): def start(*args, **kwds): iterable = func(*args, **kwds) def step(*args, **kwds): try: time = next(iterable) glib.timeout_add_seconds(time, step) except StopIteration: pass glib.idle_add(step) return start class Fun(object): def __init__(self): window = gtk.Window() vbox = gtk.VBox() btnone = gtk.Button('one') btnone.connect('clicked', self.click_one) btnone.show() vbox.pack_start(btnone) btntwo = gtk.Button('two') btntwo.connect('clicked', self.click_two) btntwo.show() vbox.pack_start(btntwo) vbox.show() window.add(vbox) window.show() @yieldsleep def click_one(self, widget, data=None): yield 1 #time.sleep(1) print '1' yield 1 #time.sleep(1) print '2' yield 1 #time.sleep(1) print '3' @yieldsleep def click_two(self, widget, data=None): yield 1 #time.sleep(1) print '4' yield 1 #time.sleep(1) print '5' yield 1 #time.sleep(1) print '6' do = Fun() gtk.main()