有人可以用这种方式给我一个涉及线程的简单例子。
我的代码问题是当我点击按钮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()
非常好,请帮助我。
答案 0 :(得分:4)
使用Python线程:http://docs.python.org/library/threading.html
类似的东西:
class SoneThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.start() # invoke the run method
def run(self):
time.sleep(1)
print "1"
time.sleep(1)
print "2"
time.sleep(1)
print "3"
现在只需调用SoneThread(),这应该可行。
此外,您需要调用gtk.gdk.threads_init()以使python线程与您的GTK +应用程序一起使用。
请参阅:http://library.gnome.org/devel/pygtk/stable/gdk-functions.html#function-gdk--threads-init
答案 1 :(得分:1)
使用gtk时,它将运行一个主循环,并将所有作为事件安排到gtk循环。你不需要线程来做任何事情。
这是一个完整的,完整的,可立即运行的示例,它使用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()