2016-02-20 15 views
8

Ich möchte erkennen, wenn die Taste XF86Launch1 auf meiner Tastatur gedrückt wird, mit Python.Multimedia Keys in Python (Linux)

Ich habe einen Headless-Server mit einer Bluetooth-Tastatur angeschlossen. Ich möchte ein Befehlszeilenprogramm immer dann starten, wenn eine bestimmte Multimediataste gedrückt wird.

Im Moment benutze ich:

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() 

Aber es wird keine Multimedia-Tasten erkennen. Nichts wird gedruckt, wenn ich sie drücke.

Gibt es eine Möglichkeit, diese Schlüssel auf einer kopflosen Ubuntu-Box zu erkennen - oder einen besseren Weg, ein Programm auf Tastendruck zu starten?

Antwort

-2

Versuchen Sie xinput test <id> stdout in einer Schleife zu lesen und die Ereignisse zu erfassen, die Sie benötigen. Hier

ist einige Beispiel in Bash:

#!/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

Ich denke , dass Ihr Problem ist, dass Multimedia-Tasten Karte nicht an Klemme Eingang.

Es ist möglich, dass Sie Fortschritte erzielen können, indem Sie xev ausführen, um den Schlüssel abzufangen, und xmodmap, um den Schlüssel einem anderen Eingang zuzuordnen.

Alternativ verwenden Sie etwas wie TKinter und sehen, ob ein grafisches Programm die Tastendrücke nicht sammelt.

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() 

Eine andere Möglichkeit besteht darin, eine F-Taste anstelle einer Multimediataste zuzuordnen. (D F9)


Edit: Weitere Forschung in diese in diesen beiden Verbindungen ergab:

Extra Keyboard Keys

Extra Keyboard Keys in Console

Die Konsole selbst keine Multimedia-Tasten unterstützt. Aber es unterstützt benutzerdefinierte F-Tasten. F30-F246 sind immer frei. Anstatt auf XF86Launch1 zu mappen, mappen Sie auf F70. Ordnen Sie dann F70 der Tastatureingabe in Ihrer Tastaturbelegung zu oder verwenden Sie das Python-Skript, das Sie bereits geschrieben haben, um es zu handhaben.

2

Anstatt zu versuchen, stdin des tty zu lesen, können Sie das Eingabegerät api von linux verwenden, um sie zu lesen.

Unter Linux sind alle Eingabegeräte zeigen sich als Datei unter /dev/input (wie /dev/input/event0) und wenn man read()s aus diesen Dateien, strukturierte Daten, die beim Drücken von Tasten und freigegeben werden zurückgegeben.

In C bietet die libevdev-Bibliothek einen Wrapper um diese. In Python könnten Sie die python-evdev library verwenden. Es sollte auch möglich sein, direkt von dem Eingabegerät zu lesen (obwohl Sie möglicherweise die Kernel-Dokumentation &-Quelle sorgfältig lesen müssen, um das richtig zu handhaben).

1

pycopia kann eine Option sein. Ich benutze es mit this Bluetooth-Taste und es scheint ziemlich gut zu funktionieren.Ich arbeite immer noch daran, es wieder mit der Taste zu verbinden, wenn die Taste in den Ruhezustand geht und dann wieder kommt. Hier ist ein Teil des Skripts, das ich verwende:
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

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() 

Wo DEVNAME ist der Name Geräte in /proc/bus/input/devices.
Sie können event in den Rückruf drucken, um herauszufinden, was die code und value für die Schaltfläche ist, die Sie suchen

+0

hey @ Joe hast du jemals den Reconnect Teil beenden, sobald die Taste einschläft? – mikebertiean