Как сохранить меню PyGTK AppIndicator открытым после щелчка?

Я пытался поиграть с модулем pygtk, чтобы сделать индикатор приложения на верхней панели в Ubuntu 17.10.

Проведя небольшое исследование, я успешно создал меню, в котором вы можете приостановить основной поток (который в настоящее время просто печатает «Обновить» на консоли.)

Сейчас столкнулся с проблемой и не нашел ответа.

Планирую сделать радио-стример для верхнего бара и закрытие меню по каждому клику было бы очень нежелательно для навигации при поиске.

Как я могу сделать так, чтобы меню оставалось открытым при нажатии на элемент?

Вот мой код:

import os
import signal
import time
from threading import Thread

import gi
gi.require_version("Gtk", "3.0")
gi.require_version("AppIndicator3", "0.1")

from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator
from gi.repository import GObject as gobject


class Indicator:

    def __init__(self, name=None, icon=None):

        self.path = os.path.abspath(os.path.dirname(__file__))

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

        if name is None:
            self.name = "MyApp"
        else:
            self.name = name

        if icon is None:
            self.icon = gtk.STOCK_INFO
        else:
            self.icon = icon

        self.indicator = appindicator.Indicator.new(
            self.name, self.icon,
            appindicator.IndicatorCategory.SYSTEM_SERVICES
            )

        self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE)

        self.indicator.set_menu(self.create_menu())

        self.running = True
        self.paused = False

        self.thread = Thread(target=self.update)
        self.thread.setDaemon(True)
        self.thread.start()

    def create_menu(self):
        menu = gtk.Menu()

        pause_entry = gtk.MenuItem("Pause")
        pause_entry.connect("activate", self.pause)
        menu.append(pause_entry)

        quit_entry = gtk.MenuItem("Quit")
        quit_entry.connect("activate", self.quit)
        menu.append(quit_entry)

        menu.show_all()
        return menu

    def update(self):
        while self.running:
            time.sleep(1)
            if not self.paused:
                print("Update", flush=True)

    def start(self):
        gobject.threads_init()
        gtk.main()

    def pause(self, menu):
        self.paused = not self.paused
        text = "Resume" if self.paused else "Pause"
        for widget in menu.get_children():
            print(widget.get_text())
            widget.set_text(text)

    def quit(self, menu=None):
        self.running = False
        gtk.main_quit()


if __name__ == "__main__":
    indicator = Indicator()
    indicator.start()

person Jebby    schedule 16.12.2017    source источник


Ответы (1)


К сожалению, я не думаю, что вы можете заставить меню оставаться открытым при нажатии на элемент.

Это преднамеренное решение, принятое разработчиками AppIndicator, чтобы убедиться, что Индикатор будет работать согласованным и унифицированным образом, и конечные пользователи не смогут применить к нему какие-либо пользовательские действия (например, щелчок правой кнопкой мыши, наведение курсора и т. д.).

Я создал appindicator, который отображает новости в режиме реального времени, и когда я исследовал соответствующий pygtk/appindicator справочный материал API; единственное разрешенное поддерживаемое действие меню, с которым я столкнулся, — это прокрутка.

Что касается вашего проекта радиостримеров, я предлагаю сделать меню основным фокусом вашего приложения и правильно назначить пункты меню окнам pygtk. Затем используйте обратные вызовы и сигналы для выполнения необходимых действий. Это подход, который я применил и в своем маленьком проекте, и он оказался довольно хорошим.

person kingJulian    schedule 08.01.2018
comment
Привет @kingJulian. Спасибо за ответ. У меня было подозрение, что это был выбор дизайна, так как я не мог найти способ держать меню открытым. Я использовал gtk.Window раньше, я просто надеялся, что, возможно, есть способ или, по крайней мере, обходной путь, чтобы меню оставалось открытым при нажатии. Спасибо за ваш вклад! - person Jebby; 09.01.2018