Как программировать один индикатор щелчка (добавьте функциональность щелчка средней кнопкой)?

Я довольно быстр с созданием Индикаторов приложения с меню. На примере ниже существует один пункт меню (выход). У меня не было бы проблем при добавлении другого объекта, моего реального приложения или строки для выполнения.

Однако то, когда я пытаюсь сделать, делают объект выполненным, когда значок индикатора нажат. Каждый раз, когда значок индикатора нажат, он будет работать. Для удаления значка индикатора пользователь нажмет на выход.

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

Это - код индикатора:

#!/usr/bin/python

import os
import signal
import subprocess
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk as gtk
gi.require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'appreveallauncher'


def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID,
                                            os.path.abspath('sample_icon.svg'),
                                            appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    indicator.set_menu(build_menu())
    gtk.main()

def build_menu():
    menu = gtk.Menu()

    item_quit1 = gtk.MenuItem('Quit')
    item_quit1.connect('activate', quit)

    item_reveallauncher = gtk.MenuItem('Reveal Launcher')
    item_reveallauncher.connect('activate', reveallauncher)

    # This is my attempt to add the middle click functionality

    menu_items = gtk.MenuItem("Reveal Launcher Middle Click")
    menu.append(menu_items)
    menu_items.connect("activate", menu_items)
    menu_items.set_secondary_activate_target(menu_items)    


    menu.append(item_reveallauncher)
    menu.append(item_quit1)
    menu.show_all()
    return menu

def menu_items(_):
    subprocess.call("xdotool key alt+F1", shell=True) 


def reveallauncher(_):
    subprocess.call("xdotool key alt+F1", shell=True) 

def quit1(_):
    gtk.main_quit()


if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    main()

#   last = self.get_last_menuitem(self.app_menu) 
#   self.app.set_secondary_activate_target(last)

Вот строка:

subprocess.call("xdotool key alt+F1", shell=True)

Это - ошибка при выполнении вышеупомянутого кода:

Traceback (most recent call last):
  File "/home/users/l/j/ljames/workspace/pythontest/src/basic.py", line 57, in <module>
    main()
  File "/home/users/l/j/ljames/workspace/pythontest/src/basic.py", line 19, in main
    indicator.set_menu(build_menu())
  File "/home/users/l/j/ljames/workspace/pythontest/src/basic.py", line 35, in build_menu
    menu_items.connect("activate", menu_items)
TypeError: second argument must be callable

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

Обновление

Я обновил свой пример кода выше для включения строк желаемого действия. Sergiy Kolodyazhnyy указал в его ответе на разрешение щелчка средней кнопкой. Я прокомментировал необходимые строки внизу. Теперь я пытаюсь получить правильный синтаксис и положение для тех строк.

1
задан 1 July 2017 в 16:28

2 ответа

Чтобы удалить ошибки и применить функциональность щелчка средней кнопкой к рассматриваемому коду (в то время как может быть много alterternative методов), я добавил аргумент build_menu оператор в основной СИ, что build_menu определение может взять аргумент. Я назвал этот аргумент indicator. Затем добавленный метод щелчка средней кнопкой, set_secondary_activate_target().

фиксированный код:

#!/usr/bin/python

import os
import signal
import subprocess
import gi
from middleClick import reveallauncher
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk as gtk
gi.require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'appreveallauncher'

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID,
                os.path.abspath('sample_icon.svg'),
                appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    indicator.set_menu(build_menu(indicator))
    gtk.main()

def build_menu(indicator):
    menu = gtk.Menu()

    item_reveallauncher = gtk.MenuItem('Reveal Launcher')
    item_reveallauncher.connect('activate', reveallauncher)   
    indicator.set_secondary_activate_target(item_reveallauncher)

    item_quit = gtk.MenuItem('Quit')
    item_quit.connect('activate', quit)

    menu.append(item_reveallauncher)
    menu.append(item_quit)
    menu.show_all()
    return menu

def reveallauncher(_):
    subprocess.call("xdotool key alt+F1", shell=True) 

def quit(_):
    gtk.main_quit()

if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    main()

существует много использований в качестве примера set_secondary_activate_target метод, который может быть найден поисками Google. Однако проблема, которую я испытал, состоит в том, что они все включены в сложный сценарий, используемый способом многих зависимых линий. Это - усилие поместить его в наиболее упрощенный пример для помощи следующему человеку, пытающемуся адаптировать его к их коду.

0
ответ дан 7 December 2019 в 13:32

Короткий ответ - то, что Вы не можете. Нажатие на значок индикатора только поднимает меню. То, что может быть сделано, должно установить середину (scrollwheel) щелчок (на сенсорных панелях правильно и прижатом друг к другу щелчке левой кнопкой), который сделан вторичным объектом установки Indicator, активируют цель.

Вот пример чего-то, что я использую в своем собственном индикатор списка средства запуска на строках 152 и 153:

152         last = self.get_last_menuitem(self.app_menu)
153         self.app.set_secondary_activate_target(last)

, Когда пользователь нажмет щелчок средней кнопкой по idicator объекту, он активирует определенный пункт меню, не снижая меню.

то, Что также можно сделать как альтернатива, должно использовать события прокрутки, что-то как этот:

86         self.app.connect("scroll-event", self.set_next)
2
ответ дан 7 December 2019 в 13:32

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

Похожие вопросы: