Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Web Flask应用程序更新GTK菜单_Python_Ubuntu_Flask_Gtk3_Python Multithreading - Fatal编程技术网

Python 从Web Flask应用程序更新GTK菜单

Python 从Web Flask应用程序更新GTK菜单,python,ubuntu,flask,gtk3,python-multithreading,Python,Ubuntu,Flask,Gtk3,Python Multithreading,我正在尝试创建一个Ubuntu指示器,它在一个单独的线程中启动一个Flask应用程序(使用multiprocessing.Process),并从Flask应用程序中的一个操作向指示器菜单添加一个项目(在这个简化的代码中,当加载根页面时,应该创建一个带有当前日期时间的菜单项)。问题是,尽管没有错误,但没有创建菜单。我正在使用其他地方推荐的GLib.idle\u add,但没有成功。代码如下: #!/usr/bin/env python # -*- coding: UTF-8 -*- import

我正在尝试创建一个Ubuntu指示器,它在一个单独的线程中启动一个Flask应用程序(使用
multiprocessing.Process
),并从Flask应用程序中的一个操作向指示器菜单添加一个项目(在这个简化的代码中,当加载根页面时,应该创建一个带有当前日期时间的菜单项)。问题是,尽管没有错误,但没有创建菜单。我正在使用其他地方推荐的GLib.idle\u add,但没有成功。代码如下:

#!/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)

解决了,这一切都是关于模块
多处理。过程
。替换为
threading.Thread
,现在一切正常