请简单的pygtk和线程示例

时间:2010-04-10 21:45:36

标签: python pygtk

有人可以用这种方式给我一个涉及线程的简单例子。

我的代码问题是当我点击按钮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()

非常好,请帮助我。

2 个答案:

答案 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()