Как изменить пункты меню в AppIndicator, когда он запущен?

В StackOverflow есть похожий вопрос, но он мне не помог: изменение элементов во время работы. Я пытался спросить в StackOverflow, но люди там, где не слишком активны: как изменить меню GTK в апплете индикатора Unity?,

Проблема в том, что если я определю изменяющую функцию вне Gtk.main(), она никогда не будет выполнена, а внутри она будет выполнена только один раз. If I make an infinite loop inside, Gtk.main() would be never executed. This is my code (modified standard example).

#!/usr/bin/env python

import sys

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

if __name__ == "__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()

Where do I put adding new menu items (or changing existing) in the code? I am a real newbie in GUI programming...

1 ответ

Решение

Надо использовать

GLib.timeout_add(10, handler_timeout)

внутри кода индикатора, где 10 - это 10 миллисекунд, время между обновлениями и handler_timeout - функция, вызываемая при каждом обновлении. Внутри этой функции можно делать все необходимые вещи, такие как проверка изменений буфера обмена и редактирование меню.

Другие вопросы по тегам