2016-02-20 7 views
8

Chcę wykryć, kiedy klawisz XF86Launch1 jest naciśnięty na klawiaturze, używając języka Python.Klawisze multimedialne w języku Python (Linux)

Mam serwer bezgłowy z klawiaturą Bluetooth. Chciałbym uruchomić program wiersza poleceń za każdym razem, gdy zostanie naciśnięty określony klawisz multimedialny.

Obecnie używam:

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

Ale nie wykryje klawiszy multimedialnych. Nic nie drukuje, kiedy je naciskam.

Czy istnieje sposób na wykrycie tych kluczy w bezgłowym pudełku Ubuntu - lub lepszy sposób na uruchomienie programu po naciśnięciu klawisza?

Odpowiedz

-2

Spróbuj przeczytać xinput test <id> stdout w pętli i przechwyć zdarzenia, których potrzebujesz.

Oto przykład w 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

myślę że problem jest to, że klawisze multimedialne nie mapować do wejścia terminala.

Możliwe, że możesz zrobić postęp, uruchamiając xev, aby uwięzić klucz i xmodmap, aby odwzorować klucz na inne wejście.

Można też użyć czegoś takiego jak TKinter i sprawdzić, czy program graficzny nie zbiera naciśnięć klawiszy.

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

Inną możliwością jest zamapowanie na klawisz F zamiast klawisza multimedialnego. (Tj F9)


Edit: Dalsze badania doprowadziły do ​​tego w tych dwóch linków:

Extra Keyboard Keys

Extra Keyboard Keys in Console

Sama konsola nie obsługuje klawiszy multimedialnych. Ale obsługuje on niestandardowe klawisze F. F30-F246 są zawsze bezpłatne. Zamiast mapować do XF86Launch1, zamapuj na F70. Następnie odwzoruj F70 na wejście klawiatury w mapie klawiatury lub użyj skryptu Python, który już napisałeś, aby go obsłużyć.

2

Zamiast próbować odczytać stdin z tty, można użyć api urządzenia wejściowego linux do ich odczytania.

W systemie Linux wszystkie urządzenia wejściowe są wyświetlane jako pliki pod numerem /dev/input (takie jak /dev/input/event0), a po jednym read()s z tych plików zwracane są dane strukturalne wskazujące, kiedy klawisze są naciskane i zwalniane.

W języku C biblioteka libevdev udostępnia otoczkę. W python można użyć python-evdev library. Powinno być również możliwe odczytanie bezpośrednio z urządzenia wejściowego (chociaż może być konieczne uważne przeczytanie źródła dokumentacji jądra, aby obsłużyć je poprawnie).

1

pycopia może być opcją. Używam go z przyciskiem bluetooth this i wygląda na to, że działa całkiem dobrze.Nadal pracuję nad tym, aby ponownie połączyć się z przyciskiem, gdy przycisk przechodzi w stan uśpienia, a następnie wraca. Oto część skryptu że używam:
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() 

Gdzie DEVNAME to nazwa urządzenia w /proc/bus/input/devices.
Można drukować event w zwrotnego, aby dowiedzieć się, co code i value jest dla przycisku szukasz

+0

hej @Joe czy kiedykolwiek zakończyć udział ponownego połączenia raz przycisk idzie spać? – mikebertiean