GtkまたはGdkとPythonでキーが現在押されているかどうかを検出する方法を誰かが知っているのだろうかと思っていましたか?このシナリオではkey-pressedまたはkey-releasedイベントを使用したくありませんが、アプリケーションの起動時に現在押されているかどうかを確認します。
具体的には、ここでアプリケーションに実行したいことを示します。
これは、Unityキーボードショートカットオーバーレイに表示される機能に似ています。この機能では、SUPERキーを2秒間押し続けるとウィンドウが表示されます。これを行うためのより良い方法があれば(バックグラウンドでプログラムを実行せずに待機することが望ましい)、それも受け入れられます。
最善の結果を期待、
ショーン
通常のボタン(トグルボタンを想定)について話していると仮定すると、 ここにあるすべてのメソッド を見ることができます。私が読んだように、あなたが探しているもののための機能はないようです。おそらくこれらはイベント駆動型であるためです。
いずれにせよ、ブール値を設定するイベントを取得して、それが押されているかどうかを確認することはできません。それ以外の場合は、イベントを巡回することが重要である理由を説明できます。
編集
元の投稿を読み違え、ボタンではなくキーボードのキーについて話していることに気付いた後、次の提案を思いつきました。
プログラムを実行すると、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()
ここにメモを追加します。私はちょうど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)キーの押された状態を検索する機能(関数、配列)がないことを意味します。