请简单的pygtk和线程示例

发布于 2021-01-29 15:00:48

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

我的代码的问题是,当我单击按钮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
被浏览
97
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看