web-dev-qa-db-ja.com

ワンクリックインジケーターをプログラムする方法(ミドルクリック機能を追加)

私はメニュー付きのアプリケーションインジケーターの作成にかなり慣れています。以下の例では、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は彼の回答にミドルクリックの解決策を示しています。下部の必要な行にコメントしました。今、私はそれらの行の正しい構文と位置を取得しようとしています。

1
L. D. James

エラーを取り除き、問題のコードにミドルクリック機能を適用するために(多くの代替メソッドがある場合があります)、_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_メソッドの使用例がいくつかあります。しかし、私が経験した問題は、それらすべてが多くの依存する行で使用される複雑なスクリプトに含まれていることです。これは、次の人がコードにそれを適応させようとするのを簡単にするために、最も単純化された例に入れようとする取り組みです。

0
L. D. James

簡単に言えば、それはできません。インジケーターアイコンをクリックしてもメニューが表示されるだけです。実行できるのは、中央(スクロールホイール)クリックを設定することです(右クリックと左クリックを同時に押したタッチパッド上)。これは、インジケーターオブジェクトの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)
2