Simple pygtk and threads example please

时光怂恿深爱的人放手 提交于 2019-11-29 15:39:09

When using gtk, it will run a main loop, and you schedule everything you want to do as events to the gtk loop. You don't need threads to do anything.

Here's a complete, full, ready-to-run example that uses glib.timeout_add to do what you want.

Note that clicking on both buttons (or multiple times on a button) doesn't freeze the gui and everything happens "at the same time"...

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

Use Python Threads: http://docs.python.org/library/threading.html

Something like:

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"

Now in sone just call SoneThread(), that should work.

Also you need to call gtk.gdk.threads_init() in order to make python threads work with your GTK+ application.

See: http://library.gnome.org/devel/pygtk/stable/gdk-functions.html#function-gdk--threads-init

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!