我怎样才能解锁 Gtk 按钮事件

How can i unlock Gtk button event

当我点击某个按钮时,整个应用程序保持锁定状态,等待方法的结果,return 某事..

所以,我有一个 Gtk.Button,我把他连接到一个函数,例如 on_button_clicked:

button = Gtk.Button()
button.connect('clicked', on_button_clicked)

函数 on_button_clicked 看起来像这样:

def on_button_clicked(widget):
    func1()
    func2()
    func3()

当函数(func1、func2、func3)运行时,整个应用程序停止,等待主函数(on_button_clicked)的结果。 os 说 'The Application is not responding'.

基本上,func1 编码一个 url,请求 url 使用 urllib,请求 return 一个 json 文件的响应,然后 func2 加载 json,然后使用来自 json 的信息制作字典,并在该字典中进行迭代打印信息。

func1(term):
        url = 'https://api.flickr.com/services/rest/?'

        values = OrderedDict([
            ('url',url),
            ('method','flickr.photos.search'),
            ('api_key', '47a28953049fe88b32522c8997e712bb'),
            ('text', term.replace(' ', '+')),
            ('format', 'json'),
            ('nojsoncallback',1)
            ])

        url_encoded = urllib.urlencode(values)
        url_encoded = urllib.unquote(url_encoded)


        request = Request(url_encoded[4:])
        try:
            response = urlopen(request, timeout =1)
        except urllib2.URLError, e:
            print 'There was an error: %r' %e

此时我无法点击或编辑其他小部件。

func1()func2()func3() 阻塞了 gtk 主循环。在这种情况下,它可能是网络请求。因此,你必须使用线程。

大概是这样的:

from threading import Thread
...
def on_button_clicked(widget):
    Thread(target=func1).start()

但是,您应该注意,如果您想从线程中修改 gtk 小部件,则必须使用 glib.idle_add()。例如,要从线程中隐藏小部件,您可以执行 glib.idle_add(widget.set_visible, False).