无法通过 Python 线程更新 appindicators 标签

无法通过 Python 线程更新 appindicators 标签

我是 Python 和 GUI 编程的新手。我试图通过做一个小应用程序来学习这两者。在我的应用程序中,后台进程应该始终运行,并通过 appindicator 显示用户的一些虚构配额。这是我的代码:

#!/usr/bin/env python

import pyjsonrpc
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator
import thread
import glib

ind = None

def start_gtk_main():
    ind = appindicator.Indicator.new(
                                  "example-simple-client",
                                  "indicator-messages",
                                  appindicator.IndicatorCategory.APPLICATION_STATUS)

    ind.set_status (appindicator.IndicatorStatus.ACTIVE)
    ind.set_label('NA', '')

    menu = Gtk.Menu()
    menu_quit = Gtk.MenuItem("Quit")
    menu_quit.connect("activate", quit_app)
    menu.append(menu_quit)
    menu_quit.show()

    ind.set_menu(menu)

    try:
        thread.start_new_thread(update_ind_label, ())
    except:
        print "Error: unable to start thread"

    Gtk.main()

def quit_app(self):
    Gtk.main_quit()

def update_ind_label():
    value = glib.timeout_add_seconds(5, handler_timeout)

def handler_timeout():
    url = "http://localhost/jsonrpc-server/"
    http_client = pyjsonrpc.HttpClient(url)
    response = http_client.call("getQuota", 2)
    quota = response.get('quota')
    ind.set_label(quota+'%', '')
    return True

if ind is None:
    start_gtk_main()

问题是每当 glib 的 timeout_add_seconds 触发回调函数 handler_timeout 时,它都会出现分段错误。

我也尝试过不使用线程,例如:

# ....other code....
glib.timeout_add_seconds(5, handler_timeout)
Gtk.main()
# ....other code....

但它给了我同样的错误。

我在网上看到很多类似的问题,大多数都建议使用 GLib 或 GObject 的超时函数或线程,但对我来说都不起作用。有人能告诉我我做错了什么吗?

仅供参考,我的操作系统是 Xubuntu 13.10。

答案1

代替:

import glib

和:

from gi.repository import GLib as glib

并且代码应该按原样工作,尽管您需要global ind在的开头 有一个start_gtk_main(),否则ind会在函数本地创建,并且您会在中得到一个handler_timeout()异常。indNone

相关内容