python gobject调用冻结gui

python gobject调用冻结gui,python,gtk,gobject,Python,Gtk,Gobject,我将python与gtk结合使用。 我想下载一个文件,在下载过程中,我在窗口上画了一个动画gif。 但每次下载开始时,gif都会冻结。我认为gobject调用应该可以解决这个问题,但似乎不是这样 电话是: 在gui类中 ... gobject.timeout_add(3000, self.load) gtk.main() 和加载函数: def load(self): ul = urllib2.open('http://xxxx/') data = ul.rea

我将python与gtk结合使用。 我想下载一个文件,在下载过程中,我在窗口上画了一个动画gif。 但每次下载开始时,gif都会冻结。我认为gobject调用应该可以解决这个问题,但似乎不是这样

电话是:

在gui类中

  ...
  gobject.timeout_add(3000, self.load)
  gtk.main()
和加载函数:

 def load(self):
     ul = urllib2.open('http://xxxx/')
     data = ul.read()
     while gtk.events_pending():
          gtk.main_iteration()
     return True
每次调用加载gui堆栈。有没有办法做得更好

原始代码:

self.opener = urllib2.build_opener() 
self.opener.addheaders.append(('Cookie', self.cookie)) 
self.state = self.opener.open('http://'+gd_adress+'/state.cst?Lang=en')
self.state_data = self.state.read()

您需要使用与GObject主循环集成的异步调用

可能最简单的方法是使用:

乔诺·培根有一本伟大的著作:

不幸的是,据我所知,GIO不支持设置HTTP cookies。在这种情况下,最好的选择可能是使用线程并使用GLib.idle\u add将数据返回到主循环,如下所示:


其思想是,这将阻塞调用封装在一个线程中,该线程在主线程准备就绪时将数据返回给主线程,因此代码的其余部分可以忽略正在使用线程的事实。

您需要使用一个与GObject主循环集成的异步调用

可能最简单的方法是使用:

乔诺·培根有一本伟大的著作:

不幸的是,据我所知,GIO不支持设置HTTP cookies。在这种情况下,最好的选择可能是使用线程并使用GLib.idle\u add将数据返回到主循环,如下所示:


其思想是将阻塞调用封装在一个线程中,该线程在主线程准备就绪时将数据返回给主线程,因此代码的其余部分可以忽略正在使用线程的事实。

是的,这正是我所需要的。但是我需要向http头添加cookie信息。。这里怎么做?下面是我真正拥有的代码:如果我像这样尝试,我会得到一个错误:GLib.threads\u init()NameError:name'GLib'不是defined@user1508490它可能是
glib
小写。根据版本的不同,您可能必须使用
gtk.threads\u init
而不是
glib.threads\u init
和/或
gobject.idle\u add
而不是
glib.idle\u add
。是的,非常感谢!!在你给我写信前一秒钟我就收到了:)现在它工作起来非常棒:)是的,这正是我需要的。但是我需要向http头添加cookie信息。。这里怎么做?下面是我真正拥有的代码:如果我像这样尝试,我会得到一个错误:GLib.threads\u init()NameError:name'GLib'不是defined@user1508490它可能是
glib
小写。根据版本的不同,您可能必须使用
gtk.threads\u init
而不是
glib.threads\u init
和/或
gobject.idle\u add
而不是
glib.idle\u add
。是的,非常感谢!!在你给我写信前一秒钟我就收到了:)现在它工作起来非常棒:)
import gio

f = gio.File(uri='http://xxxx/')
def on_ready(gdaemonfile, result):
    data, length, tag = f.load_contents_finish(result)
f.load_contents_async(on_ready)
import threading
import glib
glib.threads_init()

def load_data():
    opener = urllib2.build_opener() 
    opener.addheaders.append(('Cookie', cookie)) 
    state = opener.open('http://'+gd_adress+'/state.cst?Lang=en')
    state_data = state.read()
    glib.idle_add(on_read_data, state_data)
thread = threading.Thread(target=load_data)
thread.start()