【问题标题】:Freeze on updating multiple Gtk.Widget冻结更新多个 Gtk.Widget
【发布时间】:2014-07-19 01:07:46
【问题描述】:

我必须每 1 秒/0.1 秒/0.5 秒等更新 3 个 Gtk.Label 和几个 Gtk.DrawingArea,但我不知道为什么软件大约 10 秒后冻结

我尝试了 gtk.gdk.threads_enter/leave 或使用 lock,但无论如何 更新不会同时发生,而是它是顺序的。(因此没有任何 Gtk.Widget 与多个回调共享)

我们看一下代码:

#updating Gtk.DrawingArea
for ip in self.__cpu_info.keys(): 
    self.__cpu_info[ip]['drawing_area'].show()
    self.__cpu_info[ip]['drawing_area'].queue_draw()

#updating Gtk.Label
self.__Media_aritmetica_Label.set_text('%.2f' % self.__cpu_medie['media_aritmetica'])
self.__Media_mobile_Label.set_text('%.2f' % self.__cpu_medie['media_mobile'])
self.__Mediana_Label.set_text('%.2f' % self.__cpu_medie['mediana'])

注意::软件仅使用上述 2 个部分中的一个冻结(因此两者都冻结所需的时间更少)

【问题讨论】:

  • 请显示一些真实代码,上面的代码太短了。
  • 好的,让我们开始绘制和更新几个 Gtk.DrawingArea。请在以下位置运行文件:dropbox.com/sh/ly18mj6tg4e22jc/AACEuvzO4IneAtYG_-v-k-Wua/…
  • 将您的代码内嵌到您的问题中(代码标签是您的朋友)。
  • 由于缺少导入,我还遇到了许多其他错误。先把这个烂摊子修好。此外,用意大利语命名变量和用意大利语评论根本没有帮助。
  • 包含的 2 个 cmets 只是没用(因为这个例子很容易理解)。说到错误,我刚遇到很多 Pango-CRITICAL 错误Gtk-CRITICAL 错误;这是由于几个Gtk.Label的更新,会导致软件的终止

标签: gtk drawing refresh pygtk


【解决方案1】:

您需要使用GObject.idle_addGObject.timeout_add 将允许您完全摆脱第二个线程)与修改/访问GtkWidget 的函数一起使用。所有对绘图相关函数的访问都必须从一 (1) 个线程调用! idle/timeoout_add 将回调序列化到 glib 主循环中,这就是你想要的。

【讨论】:

  • 谢谢,但是.. 哦,天哪,现在我必须解决这个问题(所以此时它会在几秒钟后停止:错误代码 139)Couldn't register with accessibility bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
  • 开个新问题,有时间我去看看。
猜你喜欢
  • 2015-07-15
  • 2018-07-18
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
相关资源
最近更新 更多