web-dev-qa-db-ja.com

gi.repository.GdkのKEY.is_pressed()?

GtkまたはGdkとPythonでキーが現在押されているかどうかを検出する方法を誰かが知っているのだろうかと思っていましたか?このシナリオではkey-pressedまたはkey-releasedイベントを使用したくありませんが、アプリケーションの起動時に現在押されているかどうかを確認します。

具体的には、ここでアプリケーションに実行したいことを示します。

  1. キーボードショートカットで開きます。
  2. 2秒待ちます。
  3. 2秒経過してもキーボードショートカットが保持されている場合は、ウィンドウを表示します。
  4. 2秒のタイマー中の任意の時点でキーボードショートカットがリリースされた場合、ウィンドウを表示せずに終了します。

これは、Unityキーボードショートカットオーバーレイに表示される機能に似ています。この機能では、SUPERキーを2秒間押し続けるとウィンドウが表示されます。これを行うためのより良い方法があれば(バックグラウンドでプログラムを実行せずに待機することが望ましい)、それも受け入れられます。

最善の結果を期待、

ショーン

4
Sean Davis

通常のボタン(トグルボタンを想定)について話していると仮定すると、 ここにあるすべてのメソッド を見ることができます。私が読んだように、あなたが探しているもののための機能はないようです。おそらくこれらはイベント駆動型であるためです。

いずれにせよ、ブール値を設定するイベントを取得して、それが押されているかどうかを確認することはできません。それ以外の場合は、イベントを巡回することが重要である理由を説明できます。

編集

元の投稿を読み違え、ボタンではなくキーボードのキーについて話していることに気付いた後、次の提案を思いつきました。

プログラムを実行すると、gtkウィンドウが作成されて非表示になり、キーボードイベントをリッスンできるようになります。次に、プログラムを起動したショートカット(この場合はctrl-alt-u)にあるキーのいずれかからキーreleasedイベントをリッスンします。これらのキーのいずれかが起動タイムアウト内にリリースされると、タイムアウトの終了時に終了します。それ以外の場合は、プログラムが表示されます。

リソースを節約するためにプログラムコードの実際の開始を遅らせたい場合は、ダミーウィンドウを使用して、start_or_not関数の前に実際のウィンドウまたは基になるクラスをロードしないようにすることができます。

import pygtk
pygtk.require('2.0')
import gtk

class DelayedStart:

    def __init__(self):
        self.w = gtk.Window()
        self.w.connect('destroy', gtk.main_quit)
        # Connect key released events to a function
        self.w.connect('key_release_event', self.on_key_press_event)
        self.w.show_all()
        # Hide the window, we actually need a gtk window to listen for
        # keyboard events, so we just hide it
        self.w.set_decorated(False)
        self.w.set_opacity(0)

        self.show_on_timeout = True
        # Ask gtk to call the this function in 2 seconds
        gtk.timeout_add(1000*2, self.start_or_not)
        gtk.main()

    def on_key_press_event(self, widget, event):
        """ Check if any of the key in the shortcut ctrl-alt-u is released """
        # ctrl = 65507, alt = 65513, u = 117
        keys = [65507, 65513, 117]
        if event.keyval in keys:
            self.show_on_timeout = False

    def start_or_not(self):
        """ Check if the program should be started or not """
        if self.show_on_timeout:
            self.w.set_decorated(True)
            self.w.set_opacity(1)
        else:
            gtk.main_quit()
        # Returning false will destroy the timer, we only want to run this once
        return False

if __== "__main__":
    DELAYED_START = DelayedStart()
2
TLE

ここにメモを追加します。私はちょうどkeybinderライブラリーを知りました。これは明らかにTomboyのメモから分かれています(ただし、Gtk2であり、Gtk3というラベルを見たばかりです)。

Cから共有オブジェクトライブラリ.soとしてコンパイルされ、Pythonインターフェイスがあります:

python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less

masterのkeybinder/libkeybinder・engla/keybinder・GitHub ;のソースを見てください。 Cレベルでも、実装はキー押下イベントにサインアップすることで確認できます-キーボードキーの実際の押下状態を保持するもの(私には明らか)はありません。これはおそらく、残念ながら、いつでもa(ny)キーの押された状態を検索する機能(関数、配列)がないことを意味します。

0
sdaau