Mise à jour du menu GTK depuis l’application Web Flask

J’essaie de créer un indicateur Ubuntu, qui lance une application Flask dans un thread séparé (à l’aide de multiprocessing.Process ), et à partir d’une action dans l’application Flask, append un élément au menu indicateur (dans ce code simplifié, juste quand le la page racine est chargée, un élément de menu avec le datetime actuel doit être créé). Le problème est que même s’il n’y a pas d’erreurs, le menu n’est pas créé. J’utilise GLib.idle_add comme recommandé dans d’autres endroits sans succès. Ceci est le code:

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

Résolu, c’était tout au sujet du module multiprocessing.Process . Remplacé par threading.Thread et tout fonctionne bien maintenant.