Python:主线程工作时,单独的Gtk线程无响应

时间:2017-09-04 12:36:43

标签: python linux ubuntu gtk

我正在帮助一个位于ubuntu通知区域的加密货币投票机的github项目。它使用libappindicator和gtk来显示,并使用glib来设置超时。

完整代码在此处:https://github.com/bluppfisk/coinprice-indicator/tree/separate_tickers

现在,由于Appindicator的限制,我决定从主线程为我展示的每个自动收报机运行一个新的appindicator实例,并将一个单独的appindicator图标作为应用程序的“主菜单”。

然后,因为Gtk.main()进程会阻止我的脚本执行任何其他操作,所以我无法首先加载主菜单,然后在数据进入时添加每个自动收录器。所以我决定单独运行Gtk.main()线程。

这大部分工作正常:首先加载主图标,然后主线程触发其对股票信息的HTTP请求,另一个指示符在通知区域中显示正确的数据之后。

但是,每当主线程启动这些HTTP连接时,我都无法触发使用Gtk.AboutDialog()创建的关于对话框。此外,About Dialog上的关闭按钮以及任何其他UI元素仅在HTTP请求完成时作出反应。

我认为在一个单独的线程中运行Gtk.main()会同时运行它吗?

这是有趣的代码:

import threading, gi
import from gi.repository Gtk, GdkPixbuf, GObject

try:
    from gi.repository import AppIndicator3 as AppIndicator
except ImportError:
    from gi.repository import AppIndicator

Class Coin(Object):

    def __init__(self):
        self.gui_ready = threading.Event()
        self.start_main()
        self.add_indicator()
        self.add_indicator()
        Gtk.main()

    def start_main()
        self.main_item = AppIndicator.Indicator.new(appname, icon, AppIndicator.IndicatorCategory.APPLICATION_STATUS)
        self.main_item.set_status(AppIndicator.IndicatorStatus.ACTIVE)
        self.main_item.set_label("", "")
        self.main_item.set_menu(self._menu())
        self.gui_thread = threading.Thread(target=self.start_gui_thread)
        self.gui_thread.start()
        self.gui_ready.wait()

    def start_gui_thread(self):
        GObject.threads_init()
        self.gui_ready.set()
        Gtk.main()

    def _menu(self):
        menu = Gtk.Menu()
        self.about_item = Gtk.MenuItem("About")
        self.about_item.connect("activate", self._about)

    def _about(self, widget):
        about = Gtk.AboutDialog()
        # rest of code to run dialog, incl. buttons to close

    def add_indicator(self, settings=None):
        indicator = Indicator(self, len(self.instances), self.config, settings)
        self.instances.append(indicator)

0 个答案:

没有答案