私はメニュー付きのアプリケーションインジケーターの作成にかなり慣れています。以下の例では、1つのメニュー項目(終了)があります。別の項目、実際のアプリケーション、または実行する行を追加しても問題はありません。
しかし、私がしようとしているのは、インジケーターアイコンがクリックされたときにアイテムを実行させることです。インジケーターアイコンがクリックされるたびに実行されます。インジケーターアイコンを削除するには、ユーザーは[終了]をクリックします。
コードで実行する行をどこに置くかを誰かに教えてもらえますか?
これは指標コードです:
#!/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は彼の回答にミドルクリックの解決策を示しています。下部の必要な行にコメントしました。今、私はそれらの行の正しい構文と位置を取得しようとしています。
エラーを取り除き、問題のコードにミドルクリック機能を適用するために(多くの代替メソッドがある場合があります)、_build_menu
_定義が取ることができるメインsiの_build_menu
_ステートメントに引数を追加しました引数。この引数をindicator
と呼びました。次に、middleclickメソッド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()
_
Google検索で見つけることができる_set_secondary_activate_target
_メソッドの使用例がいくつかあります。しかし、私が経験した問題は、それらすべてが多くの依存する行で使用される複雑なスクリプトに含まれていることです。これは、次の人がコードにそれを適応させようとするのを簡単にするために、最も単純化された例に入れようとする取り組みです。
簡単に言えば、それはできません。インジケーターアイコンをクリックしてもメニューが表示されるだけです。実行できるのは、中央(スクロールホイール)クリックを設定することです(右クリックと左クリックを同時に押したタッチパッド上)。これは、インジケーターオブジェクトの2番目のアクティブ化ターゲットを設定することによって行われます。
これは私が自分の launcher-list-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)