2016-02-20 3 views
8

Pythonを使用してキーボードのXF86Launch1キーが押されたときを検出したいと思います。Pythonのマルチメディアキー(Linux)

私はBluetooth接続のキーボードを備えたヘッドレスサーバーを持っています。特定のマルチメディアキーが押されるたびにコマンドラインプログラムを起動したいと思います。

import sys 
import tty, termios 

def getch(): 
    fd = sys.stdin.fileno() 
    old_settings = termios.tcgetattr(fd) 
    try: 
     tty.setraw(fd) 
     ch = sys.stdin.read(1) 
    finally: 
     termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
    return ch 

print getch() 

をしかし、それは、マルチメディアキーを検出することができません。現時点では

、私が使用しています。私はそれらを押すと何も印刷されません。

ヘッドレスUbuntuのボックスにこれらのキーを検出する方法がある - やキー入力でプログラムを起動するための良い方法は?

答えて

-2

は、ループ内でxinput test <id> STDOUTを読んで、あなたが必要なイベントをキャッチしてみてください。

#!/bin/bash 

keyboard_id=9 # use xinput to find your keyboard id 

xinput test $keyboard_id | while read line ; do 
    case $line in 
     "key press 44") echo -e "\n == j pressed ==" ;; 
     "key press 45") echo -e "\n == k pressed ==" ;; 
    esac 
done 
1

私はあなたの問題は、マルチメディアキーが端末入力にマッピングしていないということです考える:ここ

はbashで、いくつかの例です。

それはあなたがトラップに異なる入力するキーをマップするための鍵とxmodmapををXEVを実行して、進捗状況を作ることができている可能性があります。

また、Tkinterのようなものを使用し、グラフィカルなプログラムがキー入力を収集することはありませんかどうかを確認します。

from Tkinter import * 

root = Tk() 

def key(event): 
    print "pressed", repr(event.char) 

def callback(event): 
    frame.focus_set() 

frame = Frame(root, width=100, height=100) 
frame.bind("<Key>", key) 
frame.bind("<Button-1>", callback) 
frame.pack() 

root.mainloop() 

もう1つの可能性は、マルチメディアキーの代わりにFキーにマッピングすることです。 (すなわち、F9)


編集:これにさらなる研究は、これら2つのリンクの結果:

Extra Keyboard Keys

Extra Keyboard Keys in Console

コンソール自体は、マルチメディアキーをサポートしていません。しかし、カスタムFキーをサポートしています。 F30-F246は常にフリーです。 XF86Launch1にマップするのではなく、F70にマップします。次に、キーマップのキーボード入力にF70をマップするか、すでに書いたPythonスクリプトを使用してそれを処理します。

2

むしろTTYのSTDINを読み取ろうとするよりも、あなたはそれらを読むために、Linuxの入力デバイスAPIを使用することができます。

Linux上ではすべての入力デバイスがのように表示され、read()sが1つの場合、キーが押されたときとリリースされたときを示す構造化データが返されます。 C、libevdevライブラリで

は、これらのラッパーを提供します。 Pythonでは、python-evdev libraryを使用することができます。また、入力デバイスから直接読み取ることも可能です(しかし、正しく処理するには、カーネルのドキュメント&のソースを慎重に読む必要があります)。

1

pycopiaはオプションです。私はthisブルートゥースボタンでそれを使用しており、それはかなりうまくいくようです。私はまだボタンがスリープ状態になって戻ってきたときにボタンに再接続するようになっています。
keyboard.py:ここで私が使用しているスクリプトの一部です

from pycopia.OS.Linux import Input 
from pycopia.OS.Linux import event 

class Satechi(Input.EventDevice): 
    DEVNAME = 'Satechi' 

    def register_callback(self, cb): 
     self._callback = cb 

    def poll(self): 
     while 1: 
      ev = self.read() 
      if ev.evtype == event.EV_KEY: 
       self._callback(ev) 

    read_handler = poll 

button.py DEVNAME/proc/bus/input/devices内のデバイス名が

from keyboard import Satechi 

def callback(event): 
    pass #Do something fun 

if __name__ == '__main__': 
    pm = Satechi() 
    pm.find() 
    pm.register_callback(callback) 

    while 1: 
     try: 
      pm.poll() 
     except OSError: 
      pm = Satechi() 
      while True: 
       try: 
        pm.find() 
        pm.register_callback(callback) 
        break 
       except IOError: 
        pass 
    pm.close() 


あなたはボタンがスリープ状態になるいったんちょっと@Joeあなたは今までに再接続部分を終了しましたcodevalueはあなたが

+0

を探しているボタンにあるかを把握するためにコールバックでeventを印刷することができますか? – mikebertiean

関連する問題