2015-05-06 2 views
0

Когда я нажимаю на какой-то кнопке, все пребывание приложения блокируется в ожидании результата от способа, чтобы вернуть что-то ..Как я могу разблокировать 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 «Приложение не отвечает».

Basicaly, func1 закодировать один URL-адрес, запросить URL-адрес, используя urllib, этот запрос возвращает ответ, который является json-файлом, а затем загрузку func2, который json, затем введите dict с информацией из 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 

За это время я не могу щелкнуть или изменить другой виджет.

+0

Вопрос действительно трудно понять. Можете ли вы отредактировать его и, возможно, включить образец кода? – tobias47n9e

+0

Вам не кажется, что мы должны знать, что делают func1 2 и 3? –

+0

basicaly, функции кодируют один URL-адрес, запрашивают этот url, используя urllib, этот запрос является json-файлом, затем загружает функцию json, а затем делает запрос с информацией из json и делает итерацию в этом dict .. –

ответ

1

func1(), func2() и func3() блокируют основной цикл gtk. В этом случае это, вероятно, сетевой запрос. Поэтому вам нужно использовать потоки.

Вероятно, что-то вроде этого:

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

Однако, следует отметить, что вы должны использовать glib.idle_add(), если вы хотите изменить GTK виджеты из потока. Например, чтобы скрыть виджет из потока, вы должны сделать glib.idle_add(widget.set_visible, False).

Смежные вопросы