如何解锁GTK按钮事件



当我单击某个按钮时,整个应用程序保持锁定等待该方法的结果,返回某物。

所以,我有一个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 Say '应用程序未响应'

基本,func1编码一个URL,请求使用Urllib的URL,该请求返回响应是JSON文件,然后返回JSON的func2加载,然后用JSON的信息进行命令,然后在此中进行迭代dict打印信息。

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)

最新更新