2016-06-22 42 views
2

我想创建一个Ubuntu指标,即启动(使用multiprocessing.Process)在一个单独的线程的烧瓶中的应用,并从烧瓶内的应用程序的操作,添加项目到指示器菜单(在这个简单的代码,就当根加载页面时,与当前日期时间的菜单项应创建)。问题是,即使没有错误,菜单也不会被创建。我使用GLib.idle_add在其他地方没有成功推荐。这是代码:更新GTK菜单

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import argparse 
from datetime import datetime 
from flask import Flask 
from multiprocessing import Process 
import signal 

import gi 
gi.require_version('Gtk', '3.0') 
gi.require_version('AppIndicator3', '0.1') 
from gi.repository import Gtk, GLib, AppIndicator3 


APP_ID = "test" 
APP_ICON = "test" 

class GtkFlaskIndicatorTest(object): 

    def __init__(self, debug): 

     self.indicator = AppIndicator3.Indicator.new(APP_ID, APP_ICON, AppIndicator3.IndicatorCategory.APPLICATION_STATUS) 
     self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE) 

     GLib.threads_init() 

     self.app = GtkFlaskApp(self, debug) 
     self.app.start_app() 

     self.menu = None 
     self.quit_menu_item = None 
     self.build_menu() 

     Gtk.main() 

    def build_menu(self): 

     self.menu = Gtk.Menu() 

     self.quit_menu_item = Gtk.MenuItem(u"Quit") 
     self.quit_menu_item.connect('activate', self.quit) 
     self.menu.append(self.quit_menu_item) 

     self.menu.show_all() 
     self.indicator.set_menu(self.menu) 

    def add_menu_item(self, text): 
     print "add_menu_item: " + text 
     GLib.idle_add(self.add_menu_item_cb, text) 

    def add_menu_item_cb(self, text): 
     print "add_menu_item_cb: " + text 
     item = Gtk.MenuItem(text) 
     self.menu.append(item) 
     self.menu.show_all() 

    def quit_control_c(self, signal, frame): 
     self.quit(None) 

    def quit(self, source): 
     self.app.stop_app() 
     Gtk.main_quit() 


class GtkFlaskApp(object): 

    def __init__(self, indicator, debug): 
     self.indicator = indicator 
     self.debug = debug 
     self.app = Flask("GtkFlaskFlaskApp") 
     self.app.add_url_rule('/', 'test', self.test) 

    def test(self): 
     text = str(datetime.now()) 
     self.indicator.add_menu_item(text) 
     return text 

    def start_app(self): 
     self.app_server = Process(target=self.start_app_thread) 
     self.app_server.start() 

    def start_app_thread(self): 
     self.app.run(port=8888, debug=self.debug, use_reloader=False) 


if __name__ == "__main__": 

    signal.signal(signal.SIGINT, signal.SIG_DFL) 

    parser = argparse.ArgumentParser() 
    parser.add_argument('--debug', action='store_true') 
    args = parser.parse_args() 

    GtkFlaskIndicatorTest(args.debug) 

回答

1

解决,它是所有关于模块multiprocessing.Process。换成threading.Thread,现在一切正常。