【问题标题】:python gobject call freezes guipython gobject调用冻结gui
【发布时间】:2012-08-22 20:58:16
【问题描述】:

我正在使用带有 gtk 的 python。 我想下载一个文件,当这发生时,我在窗口上绘制了一个动画 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()

【问题讨论】:

    标签: python gtk gobject


    【解决方案1】:

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

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

    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)
    

    Jono Bacon 有一篇很棒的文章:http://www.jonobacon.org/2010/03/15/download-files-async-with-gio-and-python/

    不幸的是,据我所知,GIO 不支持设置 HTTP cookie。在这种情况下,最好的选择可能是使用线程并使用GLib.idle_add 将数据返回到主循环,如Webkit threads with PyGObject on Gtk3

    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()
    

    这个想法是,这将阻塞调用封装在一个线程中,当它准备好时将数据返回给主线程,因此您的其余代码可以忽略线程正在被使用的事实。

    【讨论】:

    • 是的,这正是我所需要的。但我需要在 http 标头中添加一个 cookie 信息。如何在这里执行此操作?这是我真正拥有的代码:
    • 如果我这样尝试,我得到一个错误:GLib.threads_init() NameError: name 'GLib' is not defined
    • @user1508490 它可能是glib 小写。根据版本,您可能必须使用 gtk.threads_init 而不是 glib.threads_init 和/或 gobject.idle_add 而不是 glib.idle_add
    • 是的,非常感谢!!我在你给我写信之前 1 秒就知道了 :) 现在它的工作非常棒 :)
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2020-08-06
    • 2015-04-08
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多