当我点击某个按钮时,整个应用程序保持锁定等待该方法的结果,返回一些东西..
所以,我有一个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)的结果。操作系统说'应用程序没有响应' 。
基本上,func1编码一个url,请求url使用urllib,该请求返回一个json文件的响应,然后func2加载json,然后用json创建一个带有信息的dict,并在此处进行迭代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
在这段时间我无法点击或编辑其他小部件。
答案 0 :(得分:1)
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)
。