web-dev-qa-db-fra.com

Comment changer les entrées de menu dans AppIndicator, lorsqu'il est en cours d'exécution?

Il y a une question similaire sur StackOverflow, mais cela ne m'a pas aidé: Changer les éléments pendant l'exécution . J'ai essayé de demander à StackOverflow, mais les gens là-bas n'étaient pas trop actifs: Comment changer le menu GTK dans l'applet indicateur Unity? .

Le problème est que si je définis la fonction changeante en dehors de Gtk.main (), elle ne sera jamais exécutée et à l'intérieur elle ne sera exécutée qu'une seule fois. Si je fais une boucle infinie à l'intérieur, Gtk.main () ne sera jamais exécuté. Ceci est mon code (exemple standard modifié).

#!/usr/bin/env python

import sys

from gi.repository import Gtk, Gdk
from gi.repository import AppIndicator3 as appindicator

if __== "__main__":
    ind = appindicator.Indicator.new ("example-simple-client",
                                      "indicator-messages",
                         appindicator.IndicatorCategory.APPLICATION_STATUS)
    ind.set_status (appindicator.IndicatorStatus.ACTIVE)
    ind.set_attention_icon ("indicator-messages-new")

    menu = Gtk.Menu()
    menu_quit = Gtk.MenuItem('Quit')
    def add_item(menu, label):
        menu.append(MenuItem(label))
    menu.append(menu_quit)
    def quit_app(w):
        sys.exit(0)
    menu_quit.connect('activate', quit_app)
    menu_quit.show()
    ind.set_menu(menu)   
    Gtk.main()

Où dois-je ajouter de nouveaux éléments de menu (ou modifier des éléments existants) dans le code? Je suis un vrai débutant en programmation GUI ...

3
Phlya

Il faut utiliser

GLib.timeout_add(10, handler_timeout)

à l'intérieur du code indicateur, où 10 - soit 10 millisecondes, temps entre l'actualisation et handler_timeout - fonction à appeler à chaque rafraîchissement. À l'intérieur de cette fonction, on peut faire tout le nécessaire, comme vérifier les modifications du presse-papiers et éditer le menu.

3
Phlya