我是 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()
异常。ind
None