Я довольно быстр с созданием Индикаторов приложения с меню. На примере ниже существует один пункт меню (выход). У меня не было бы проблем при добавлении другого объекта, моего реального приложения или строки для выполнения.
Однако то, когда я пытаюсь сделать, делают объект выполненным, когда значок индикатора нажат. Каждый раз, когда значок индикатора нажат, он будет работать. Для удаления значка индикатора пользователь нажмет на выход.
Кто-то может сказать мне, куда поместить мою строку для выполнения в коде?
Это - код индикатора:
#!/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 указал в его ответе на разрешение щелчка средней кнопкой. Я прокомментировал необходимые строки внизу. Теперь я пытаюсь получить правильный синтаксис и положение для тех строк.
Чтобы удалить ошибки и применить функциональность щелчка средней кнопкой к рассматриваемому коду (в то время как может быть много 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. Однако проблема, которую я испытал, состоит в том, что они все включены в сложный сценарий, используемый способом многих зависимых линий. Это - усилие поместить его в наиболее упрощенный пример для помощи следующему человеку, пытающемуся адаптировать его к их коду.
Короткий ответ - то, что Вы не можете. Нажатие на значок индикатора только поднимает меню. То, что может быть сделано, должно установить середину (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)