python - 单击后如何保持 PyGTK AppIndicator 菜单打开?

标签 python ubuntu pygtk python-3.6 appindicator

我尝试使用 pygtk 模块在 Ubuntu 17.10 的顶部栏中制作一个应用程序指示器。

通过一些研究,我成功地制作了一个菜单,您可以在其中暂停主线程(当前仅将“更新”打印到控制台。)

现在我遇到了一个问题,找不到答案。

我计划为顶部栏制作一个 radio 流媒体,每次点击时关闭的菜单对于搜索时的导航来说是非常不受欢迎的。

单击项目时如何使菜单保持打开状态?

这是我的代码:

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()

最佳答案

不幸的是,我认为您无法在单击某个项目时让菜单保持打开状态。

这是一个有意的设计 decision由 AppIndicator 开发人员采取,以确保指示器以一致和统一的方式运行,并且最终用户不可能应用任何自定义操作(例如右键单击、鼠标悬停等)。

我创建了一个 appindicator实时显示新闻,当我研究相关的 pygtk/appindicator API 引用资料时;我遇到的唯一允许支持的菜单操作是滚动。

关于您的 radio 流媒体项目,我建议将菜单作为您应用程序的主要焦点,并将菜单项适本地发送到 pygtk 窗口。然后使用 callbacks and signals执行必要的操作。这也是我在我的小项目中采用的方法,结果非常好。

关于python - 单击后如何保持 PyGTK AppIndicator 菜单打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47850671/

相关文章:

python - pb 在 python optparse 模块中带有回调

python - 如何将gensim引入pycharm

r - 如何在 Ubuntu 中安装 R 包 "udunits2"

python - 调用 gtk.main 后执行函数

pygtk - 如何将菜单栏粘贴在窗口顶部 PyGTK

python - 如何捕获大括号之间的文本以及这些大括号内的特定模式

python - 基于关键字遍历 pandas 数据框

python - 我可以在 Django 的登录过程中使用外部数据库表吗?

Ubuntu 版本之间的 Git checkout

python - 如何制作绘图区域显示内容的迷你示例