Girişi farklı klavyelerden nasıl ayırt edebilirim?


14

Python'da varsayılan klavyenizle kullanabileceğiniz bir uygulama ve uygulama için özel olarak tasarlanmış bir uygulama yazmak istiyorum. Basitçe, farklı tuşlara eylemler vermek için çıkartmaları olan küçük bir sayısal klavye kullanarak tasarlayacağım. Her iki klavye de USB ile bağlanacaktır.

Bununla birlikte, bu tuşlara basıldığında, sadece normal sinyalleri (sayılar, operatörler ve girişler) Python'a gönderilir ve ana klavyeden özel klavyeden sinyalleri ayırt edemez.

Python'un (bulabildiğim kadarıyla) bu ayrımı yapmak için bir yöntemi olmadığı için, bunu işletim sisteminin kendisinde yapmak istiyorum. Raspberry Pi için programlayacağım, bu yüzden Linux olacak.

Yani, ana soru: Belirli bir klavyenin tuşlarını diğer tuş kodlarına nasıl yeniden aktarabilirim. Başka amaçlar için kullanmayacağım F tuşlarını kullanmayı düşündüm; veya yalnızca herhangi bir klavyede bulunmayan bazı karakterler (böyle olduğunu varsayalım).

Linux / Unix'te bu mümkün müdür? Ve eğer öyleyse, bunu nasıl yapabilirim?


Klavye nasıl takılacak? Doğrudan cihazdan okumak isteyebilirsiniz. Benim için en bariz yol, herhalde daha iyi bir yol olduğunu düşünüyorum.
TNW

USB ile bağlanacaklarını ekledim. Python kullanarak doğrudan cihazdan nasıl okuyabilirim?
Steven Roose

Kabul edilmeyen cevap, kabul edilen cevaptan çok daha basit gibi görünüyor.
Nikana Reklawyks

Yanıtlar:


12

Linux kullanıyorsanız, giriş aygıtları arasında ayrım yapmanın en iyi yolu Linux Olay Arayüzünü kullanmaktır . Bir aygıtın donanıma özgü girdisinin kodu çözüldükten sonra, Linux'a özgü bir ara olay yapısına dönüştürülür ve altındaki bir veya daha fazla karakter aygıtını okuyarak kullanılabilir hale gelir /dev/input/. Bu, kullandığınız programlama dilinden tamamen bağımsızdır.

Her donanım aygıtı kendi aygıtını alır ve /dev/input/eventXayrıca kümeler de vardır (örn /dev/input/mice. Sistemdeki tüm farelerin hareketini temsil eder). Sisteminizde /dev/input/by-pathve de olabilir /dev/input/by-id.

Cihazın adını insan tarafından okunabilen bir dize olarak döndüren bir ioctlçağrı EVIOCGNAMEvar veya böyle bir şey kullanabilirsiniz /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Cihazı açarsınız ve giriş donanımından her olay geldiğinde bir paket veri alırsınız. C'yi okuyabiliyorsanız, /usr/include/linux/input.hbu şeyin tam olarak nasıl çalıştığını gösteren dosyayı inceleyebilirsiniz. Bunu yapmazsanız, ihtiyacınız olan tüm bilgileri sağlayan bu soruyu okuyabilirsiniz .

Olay arayüzü ile ilgili iyi olan şey, sadece hangi cihaza ihtiyacınız olduğunu bulmanız ve yalnızca bu giriş cihazından girişi okuyarak diğerlerini görmezden gelmenizdir . Ayrıca, sadece bir terminalden 'pişmiş' karakter akışını okuyarak normalde yapmayacağınız tuşlar, düğmeler ve kontroller hakkında bildirim alırsınız: hatta ölü anahtarlar Shift, vb.

Kötü olan şey, olay arayüzünün 'pişmiş' karakterler döndürmemesi, sadece tuşlar için sayısal kodlar kullanmasıdır (her anahtara karşılık gelen kodlar yukarıda belirtilen başlık dosyasında bulunur - aynı zamanda event.py'nin Python kaynağında da bulunur . Giriş aygıtınızda olağandışı tuşlar / düğmeler varsa, doğru numaraları elde edene kadar biraz deneme yapmanız gerekebilir.


2

Alternatif bir yaklaşım ("klavyenizde" çok fazla tuş yoksa - birçok cihaz klavye gibi davranıyorsa), her klavyeye özel bir tuş eşlemesi uygulamak ve tuşların ayırt edilmesini sağlamaktır.

Bu burada özetlenmiştir: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Ana nokta setxkbmapbir aygıt argümanı almaktır.

Ham giriş yaklaşımını kullanıyorsanız lsinput ham cihazınızı sizin için bulur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.