Làm thế nào để phân biệt đầu vào từ bàn phím khác nhau?


14

Tôi muốn viết một ứng dụng bằng Python mà bạn có thể sử dụng với bàn phím mặc định của mình và một ứng dụng được thiết kế đặc biệt cho ứng dụng. Tôi sẽ thiết kế nó đơn giản bằng cách sử dụng một bàn phím số nhỏ có nhãn dán để thực hiện các hành động cho các phím khác nhau. Cả hai bàn phím sẽ được gắn bằng USB.

Tuy nhiên, khi các phím này được nhấn, chỉ các tín hiệu thông thường của chúng (số, toán tử và nhập), sẽ được gửi tới Python và nó sẽ không thể phân biệt giữa các tín hiệu từ bàn phím chính và bàn phím đặc biệt.

Bởi vì Python (theo như tôi có thể tìm thấy) không có phương pháp nào để tạo sự khác biệt này, tôi muốn thực hiện nó trên chính hệ điều hành. Tôi sẽ lập trình nó cho Raspberry Pi, vì vậy nó sẽ là Linux.

Vì vậy, câu hỏi chính: Làm thế nào tôi có thể sắp xếp lại các phím của một bàn phím cụ thể sang các mã phím khác. Tôi đã nghĩ về việc sử dụng các phím F mà tôi sẽ không sử dụng cho các mục đích khác; hoặc chỉ một số ký tự không có trên bất kỳ bàn phím nào (giả sử là có).

Điều này có thể có trong Linux / Unix không? Và nếu vậy, làm thế nào tôi có thể làm điều đó?


Bàn phím sẽ được gắn như thế nào? Bạn có thể muốn đọc thẳng từ thiết bị. Đó là cách rõ ràng nhất đối với tôi, mặc dù tôi cho rằng có một cách tốt hơn.
TNW

Tôi đã thêm rằng họ sẽ kết nối bằng USB. Làm cách nào tôi có thể đọc trực tiếp từ thiết bị bằng Python?
Steven Roose

Có vẻ như câu trả lời không được chấp nhận đơn giản hơn nhiều so với câu trả lời được chấp nhận.
Nikana Reklawyks

Câu trả lời:


12

Nếu bạn đang sử dụng Linux, cách tốt nhất để phân biệt giữa các thiết bị đầu vào là sử dụng Giao diện sự kiện Linux . Sau khi đầu vào dành riêng cho phần cứng của thiết bị được giải mã, nó được chuyển đổi sang cấu trúc sự kiện dành riêng cho Linux và được cung cấp bằng cách đọc một hoặc nhiều thiết bị ký tự bên dưới/dev/input/ . Điều này hoàn toàn độc lập với ngôn ngữ lập trình bạn sử dụng.

Mỗi thiết bị phần cứng có thiết bị riêng /dev/input/eventXvà cũng có các tập hợp (ví dụ: /dev/input/miceđại diện cho chuyển động của tất cả chuột trong hệ thống). Hệ thống của bạn cũng có thể có/dev/input/by-path/dev/input/by-id.

Có một cuộc ioctlgọiEVIOCGNAME trả về tên của thiết bị dưới dạng một chuỗi có thể đọc được bằng con người hoặc bạn có thể sử dụng một cái gì đó như /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Bạn mở thiết bị và mỗi khi có sự kiện đến từ phần cứng đầu vào, bạn sẽ nhận được một gói dữ liệu. Nếu bạn có thể đọc C, bạn có thể nghiên cứu tệp /usr/include/linux/input.hcho biết chính xác cách thức hoạt động của công cụ này. Nếu bạn không, bạn có thể đọc câu hỏi này cung cấp tất cả thông tin bạn cần.

Những điều tốt về giao diện sự kiện là bạn chỉ cần tìm ra những gì thiết bị bạn cần, và bạn có thể đọc thông tin từ đó thiết bị đầu vào chỉ , bỏ qua tất cả những người khác. Bạn cũng sẽ nhận được thông báo về các phím, nút và điều khiển mà bạn thường không chỉ bằng cách đọc luồng ký tự 'đã nấu' từ thiết bị đầu cuối: ngay cả các phím chết như Shift, v.v.

Điều tệ hại là giao diện sự kiện không trả về các ký tự 'đã nấu', nó chỉ sử dụng mã số cho các khóa (mã tương ứng với mỗi khóa được tìm thấy trong tệp tiêu đề đã nói ở trên - mà còn trong nguồn event event của Python . Nếu thiết bị đầu vào của bạn có các phím / nút bất thường, bạn có thể cần thử nghiệm một chút cho đến khi bạn nhận được đúng số.


2

Một cách tiếp cận khác (nếu "bàn phím" của bạn không có nhiều phím - nhiều thiết bị giả vờ là bàn phím) là áp dụng một sơ đồ bàn phím cho từng bàn phím và đảm bảo rằng các phím được phân biệt.

Điều này được phác thảo ở đây: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Điểm chính làsetxkbmap một đối số mất thiết bị.

Nếu bạn đang sử dụng phương pháp nhập liệu thô, lsinput sẽ tìm thiết bị thô cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.