2009-02-22 34 views
7

Tôi phải biết phím nào được nhấn, nhưng không cần mã của Ký tự, tôi muốn biết khi ai đó nhấn phím 'A' ngay cả khi khóa nhận được là 'a' hoặc 'A', và như vậy với tất cả các phím khác.Cách lấy mã khóa trong Python

Tôi không thể sử dụng PyGame hoặc bất kỳ thư viện nào khác (bao gồm cả Tkinter). Chỉ Thư viện chuẩn Python. Và điều này phải được thực hiện trong một thiết bị đầu cuối, không phải là một giao diện đồ họa.

KHÔNG CẦN MÃ MÃ. TÔI CẦN BIẾT MÃ MÃ.

Ex:

ord('a') != ord('A')      # 97 != 65 
someFunction('a') == someFunction('A') # a_code == A_code 
+0

đồ họa hoặc thiết bị đầu cuối giao diện người dùng? – iny

+0

Windows hoặc Linux? Vui lòng cập nhật câu hỏi, thay vì thêm một nhận xét khác. –

+0

Vui lòng cập nhật câu hỏi của bạn bằng dấu "Chỉnh sửa" để hiển thị câu hỏi nâng cao của bạn. – myroslav

Trả lời

20

Xem mô-đun chuẩn tty. Nó cho phép chuyển từ chế độ mặc định theo dòng (được nấu chín) sang chế độ char (định hướng) với tty.setcbreak(sys.stdin). Đọc đơn char từ sys.stdin sẽ cho kết quả thành chìa khóa bàn phím ép tiếp theo (nếu nó tạo code):

import sys 
import tty 
tty.setcbreak(sys.stdin) 
while True: 
    print ord(sys.stdin.read(1)) 

Lưu ý: Giải pháp là Unix (bao gồm cả Linux) mà thôi.

Chỉnh sửa: Trên Windows, hãy thử msvcrt.getche()/getwche()./Tôi có nơi nào để thử ...


Chỉnh sửa 2: Sử dụng giao diện điều khiển API win32 ở mức độ thấp qua ctypes.windll (xem example at SO) với ReadConsoleInput chức năng. Bạn nên lọc các lần nhấn phím - e.EventType==KEY_EVENT và tìm giá trị e.Event.KeyEvent.wVirtualKeyCode. Ví dụ về ứng dụng (không phải trong Python, chỉ để có được một ý tưởng) có thể được tìm thấy tại http://www.benryves.com/tutorials/?t=winconsole&c=4.

+0

lặp lại, tôi không cần mã ký tự, tôi cần Mã khóa, nhấn phím A hoặc SHIFT + A phải giống nhau. Sử dụng ord() sẽ trả về một giá trị whit A và một whith SHIFT + A; và các phím số như mũi tên sẽ không hoạt động –

+0

Tôi nghĩ câu hỏi bạn đang hỏi là quá thấp. Nó có giá trị trong DOS. Hệ điều hành ngày nay sử dụng cách tiếp cận keymapping từ các phím đến các ký hiệu, giúp dễ dàng chuyển đổi bố trí bàn phím (ngôn ngữ), do đó có rất ít cơ hội nhận được các phím bấm mức thấp. pygame workaround đó. – myroslav

+0

ok. cảm ơn. đó là những gì tôi muốn biết –

9

Tùy thuộc vào những gì bạn đang cố gắng để hoàn thành, có lẽ sử dụng một thư viện như pygame sẽ làm những gì bạn muốn. Pygame chứa nhiều thao tác nhấn phím nâng cao hơn bình thường có sẵn với các thư viện chuẩn của Python.

+0

cảm ơn, nhưng tôi không phải sử dụng bất kỳ thư viện nào khác ngoài thư viện chuẩn python. –

+1

OK. Tôi để lại câu trả lời ở đây (và không xóa nó) bởi vì nó có thể hữu ích cho người khác đến đây hỏi một câu hỏi tương tự. –

+1

Và đối với bất cứ ai downvoted này: Câu hỏi ban đầu đã không nói rằng pygame là không thể chấp nhận được. –

3

Bạn có thể sẽ phải sử dụng Tkinter, đó là gui 'chuẩn' của Python và đã được đưa vào python trong nhiều năm.

Giải pháp dòng lệnh có thể không khả dụng, vì cách dữ liệu đi vào và ra khỏi các quy trình dòng lệnh. Các chương trình GUI (của một số hương vị hay cách khác) đều nhận được đầu vào của người dùng thông qua luồng sự kiện (có thể được bao bọc bởi thư viện). Mỗi sự kiện sẽ là bản ghi chi tiết của sự kiện. Đối với các sự kiện tổ hợp phím, bản ghi sẽ có thể chứa bất kỳ mã khóa, bit trường khóa bổ trợ hoặc ký tự văn bản nào trong một số mã hóa. Trường nào và cách chúng được đặt tên phụ thuộc vào thư viện sự kiện bạn đang gọi.

Chương trình dòng lệnh nhận đầu vào của người dùng thông qua các luồng ký tự. Không có cách nào để thu thập dữ liệu cấp thấp hơn. Như myroslav giải thích trong bài viết của anh ta, tty có thể ở chế độ nấu chín hoặc chưa nấu, sự khác biệt duy nhất là ở chế độ nấu, terminal sẽ xử lý (một số) ký tự điều khiển cho bạn, như xóa và nhập để quá trình nhận dòng đầu vào của 1 ký tự cùng một lúc.

Xử lý mọi thứ thấp hơn yêu cầu (hệ điều hành phụ thuộc) hệ thống gọi hoặc mở thiết bị ký tự trong/dev. Thư viện chuẩn của Python không cung cấp cơ sở tiêu chuẩn cho việc này.

0

Nếu bạn chỉ cần làm việc trong cửa sổ, bạn nên thử msvcrt.

0

Câu trả lời rõ ràng:

someFunction = string.upper 

ord('a') != ord('A')      # 97 != 65 
someFunction('a') == someFunction('A') # a_code == A_code 

hoặc trong khác (key) từ:

char_from_user = getch().upper() # read a char converting to uppercase 
if char == 'Q': 
    # quit 
    exit = True # or something 
elif char in ['A', 'K']: 
    do_something() 

vv ...

Đây là một thực hiện của hàm getch, mà có thể hoạt động trên cả nền tảng Windows và Linux, based on this recipe:

class _Getch(object): 
    """Gets a single character from standard input. 
     Does not echo to the screen.""" 
    def __init__(self): 
     try: 
      self.impl = _GetchWindows() 
     except ImportError: 
      self.impl = _GetchUnix() 

    def __call__(self): 
     return self.impl() 

class _GetchUnix(object): 
    def __init__(self): 
     import tty, sys 

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


class _GetchWindows(object): 
    def __init__(self): 
     import msvcrt 

    def __call__(self): 
     import msvcrt 
     return msvcrt.getch() 


getch = _Getch() 
0

chức năng này sẽ trả về mã cho ký tự chữ hoa:

def upCcode(ch): 
    if(len(ch) == 1): 
     return ord(ch.upper()) 

và điều này là dành cho mã ký tự chữ thường:

def lowCcode(ch): 
     if(len(ch) == 1): 
      return ord(ch.lower()) 

cách này là xa dễ dàng hơn, và bạn sẽ không cần phải nhập thư viện bên ngoài.

Bạn sẽ cần phải chọn một trong hai phương pháp là 'someFunction' mà bạn đã mô tả trong câu hỏi của mình. Dưới đây là một ví dụ:

OUTPUT:

# when using upCode(): 
>> upCcode('a') 
65 

>> upCcode('A') 
65 

# when using lowCode(): 
>> lowCcode('a') 
97 

>> lowCcode('A') 
97 
Các vấn đề liên quan