2012-08-29 34 views
33

Tôi mới dùng Python, và tôi vừa tạo một trò chơi và một menu bằng Python. Câu hỏi là, sử dụng (raw_) input() yêu cầu tôi phải nhấn enter sau mỗi lần nhấn phím, tôi muốn thực hiện để nhấn mũi tên xuống sẽ ngay lập tức chọn mục menu tiếp theo hoặc di chuyển xuống trong trò chơi. Tại thời điểm này, nó đòi hỏi tôi phải thích loại "xuống" và sau đó nhấn Enter. Tôi cũng đã làm khá nhiều nghiên cứu, nhưng tôi không muốn tải xuống các mô-đun lớn (ví dụ: pygame) chỉ để đạt được một phương thức keyDown() duy nhất. Vì vậy, có cách nào dễ dàng hơn, mà tôi chỉ không thể tìm thấy?Phương pháp Python để đọc nhấn phím?

Chỉnh sửa: Chỉ cần phát hiện ra rằng msvcrt.getch() sẽ thực hiện thủ thuật. Nó không phải keyDown(), nhưng nó hoạt động. Tuy nhiên, tôi không chắc chắn làm thế nào để sử dụng nó, hoặc, nó có vẻ khá lạ, bất kỳ trợ giúp ở đây? Đây là những gì tôi nhận được vào lúc này:

from msvcrt import getch 
while True: 
    key = getch() 
    print(key) 

Tuy nhiên, nó giữ cho tôi tất cả các byte vô nghĩa, ví dụ, mũi tên xuống là thế này:

b'\xe0' 
b'P' 

Và tôi không có ý tưởng làm thế nào để sử dụng chúng, tôi đã cố gắng để so sánh với chr() và thậm chí sử dụng ord() nhưng không thể thực sự làm bất kỳ so sánh. Những gì tôi đang cố gắng thực hiện cơ bản là:

from msvcrt import getch 
while True: 
    key = getch() 
    if key == escape: 
     break 
    elif key == downarrow: 
     movedown() 
    elif key == 'a': 
     ... 

Và cứ thế ... Bạn có trợ giúp không?

+0

Không phải là một trùng lặp. Đây là về các sự kiện keydown, không phải đầu vào ký tự đơn. – Deestan

+7

Tôi có thể làm mờ giải pháp đa nền tảng ?? 'msvcrt' không có sẵn trên phân phối mac/linux của Python – cat

Trả lời

47

Tự tìm hiểu bằng cách tự mình kiểm tra tất cả nội dung. Không thể tìm thấy bất kỳ chủ đề nào về nó tho, vì vậy tôi sẽ để lại giải pháp ở đây. Đây có thể không phải là giải pháp duy nhất hoặc thậm chí là tốt nhất, nhưng nó hoạt động cho mục đích của tôi (trong giới hạn của getch) và tốt hơn là không có gì.

Lưu ý: thích hợp keyDown() sẽ nhận ra tất cả các phím và phím bấm thực tế, vẫn được đánh giá.

Giải pháp: sử dụng ord() -function đầu tiên xoay getch() vào một số nguyên (tôi đoán họ là mã chủ chốt ảo, nhưng không quá chắc chắn) hoạt động tốt, và sau đó so sánh kết quả với con số thực tế đại diện cho mong muốn Chìa khóa. Ngoài ra, nếu tôi cần, tôi có thể thêm thêm chr() xung quanh số được trả về để nó sẽ chuyển đổi thành ký tự. Tuy nhiên, tôi đang sử dụng chủ yếu là xuống mũi tên, esc, vv để chuyển đổi những người để một nhân vật sẽ là ngu ngốc.Dưới đây là đoạn code cuối cùng:

from msvcrt import getch 
while True: 
    key = ord(getch()) 
    if key == 27: #ESC 
     break 
    elif key == 13: #Enter 
     select() 
    elif key == 224: #Special keys (arrows, f keys, ins, del, etc.) 
     key = ord(getch()) 
     if key == 80: #Down arrow 
      moveDown() 
     elif key == 72: #Up arrow 
      moveUp() 

Ngoài ra nếu ai đó cần, bạn có thể dễ dàng tìm ra các mã phím từ google, hoặc bằng cách sử dụng python và chỉ cần nhấn phím:

from msvcrt import getch 
while True: 
    print(ord(getch())) 
+2

Cảm ơn bạn, đây là câu trả lời đầu tiên làm việc cho tôi. +1 –

+1

Tôi đang sử dụng mã trên, nhưng mã của tôi chỉ đơn giản là chặn tại getch(), và không có gì xảy ra sau đó. bất kỳ giúp đỡ? –

+1

@AnumSheraz Phương thức trên chỉ hoạt động khi bạn chạy mã từ dấu nhắc lệnh. – Moondra

8

Xem tài liệu MSDN getch. Cụ thể:

Hàm _getch và_getwch đọc một ký tự đơn lẻ từ bảng điều khiển mà không lặp lại ký tự. Không có chức năng nào trong số này có thể được sử dụng để đọc CTRL + C. Khi đọc một phím chức năng hoặc một phím mũi tên, mỗi chức năng phải được gọi hai lần; cuộc gọi đầu tiên trả về 0 hoặc 0xE0 và cuộc gọi thứ hai trả về mã khóa thực.

Hàm Python trả về một ký tự. bạn có thể sử dụng ord() để lấy giá trị số nguyên bạn có thể kiểm tra, ví dụ keycode = ord(msvcrt.getch()).

Vì vậy, nếu bạn đọc 0x00 hoặc 0xE0, hãy đọc lần thứ hai để lấy mã khóa cho mũi tên hoặc phím chức năng. Từ thử nghiệm, 0x00 trước F1-F10 (0x3B-0x44) và 0xE0 trước các phím mũi tên và Ins/Del/Home/End/PageUp/PageDown.

+0

Tôi đã tìm ra nó ngay bây giờ, nhưng không thể đăng giải pháp cuối cùng. Nhưng điều này + ord() + char() –

0
from msvcrt import getch 

pos = [0, 0] 

def fright(): 
    global pos 
    pos[0] += 1 

def fleft(): 
    global pos 
    pos[0] -= 1 

def fup(): 
    global pos 
    pos[1] += 1 

def fdown(): 
    global pos 
    pos[1] -= 1 

while True: 
    print'Distance from zero: ', pos 
    key = ord(getch()) 
    if key == 27: #ESC 
     break 
    elif key == 13: #Enter 
     print('selected') 
    elif key == 32: #Space 
     print('jump') 
    elif key == 224: #Special keys (arrows, f keys, ins, del, etc.) 
     key = ord(getch()) 
     if key == 80: #Down arrow 
      print('down') 
      fdown 
     elif key == 72: #Up arrow 
      print('up') 
      fup() 
     elif key == 75: #Left arrow 
      print('left') 
      fleft() 
     elif key == 77: #Right arrow 
      print('right') 
      fright() 
+2

Vui lòng thêm một số giải thích cho câu trả lời của bạn để giải thích mã của bạn. – AJ123

Các vấn đề liên quan