Estou fazendo um programa do tipo cronômetro em python e gostaria de saber como detectar se uma tecla é pressionada (como p para pausar es para parar), e não gostaria que fosse algo como raw_input que espera pelo entrada do usuário antes de continuar a execução. Alguém sabe fazer isso em um loop while?
Além disso, gostaria de fazer esta plataforma cruzada, mas se isso não for possível, meu principal alvo de desenvolvimento é o Linux
python
python-2.7
keypress
detect
lobuo
fonte
fonte
Respostas:
Python possui um módulo de teclado com muitos recursos. Instale-o, talvez com este comando:
Em seguida, use-o em códigos como:
fonte
keyboard
aparentemente requer raiz no linux: /Para aqueles que estão no Windows e estavam lutando para encontrar uma resposta que funcionasse, aqui está a minha: pynput
A função acima imprimirá qualquer tecla que você estiver pressionando e iniciará uma ação quando você soltar a tecla 'esc'. A documentação do teclado está aqui para um uso mais variado.
Markus von Broady destacou um problema potencial que é: Esta resposta não exige que você esteja na janela atual para que este script seja ativado, uma solução para o Windows seria:
fonte
Como OP menciona sobre raw_input - isso significa que ele quer a solução cli. Linux: curses é o que você quer (windows PDCurses). Curses, é uma API gráfica para software CLI, você pode conseguir mais do que apenas detectar eventos-chave.
Este código detectará as chaves até que uma nova linha seja pressionada.
fonte
termios
e assim por diante ...import os
para poder sair saia do exemplo.win.nodelay(False)
, em vez deTrue
, não irá gerar um milhão de exceções por segundo.Existem mais coisas que podem ser feitas com o
keyboard
módulo.Aqui estão alguns dos métodos:
Método 1:
Usando a função
read_key()
:Isso vai quebrar o loop quando a tecla pfor pressionada.
Método 2:
Usando a função
wait
:Ele esperará que você pressione pe continue o código conforme é pressionado.
Método # 3:
Usando a função
on_press_key
:Ele precisa de uma função de retorno de chamada. Usei
_
porque a função do teclado retorna o evento do teclado para essa função.Uma vez executado, ele executará a função quando a tecla for pressionada. Você pode parar todos os ganchos executando esta linha:
Método # 4:
Este método já foi respondido pelo usuário8167727, mas eu discordo do código que eles fizeram. Ele estará usando a função,
is_pressed
mas de outra forma:Isso interromperá o loop quando pfor pressionado.
Notas:
keyboard
lerá as teclas pressionadas de todo o sistema operacional.keyboard
requer root no linuxfonte
keyboard.wait()
esperar mais de uma tecla e continuar se alguma delas for pressionadawait()
não oferece essa funcionalidade. Você terá que usarkeyboard.read_key()
com uma condição if compactada em um loop while. Veja o método # 1suppress
uso de palavras - chave emkeyboard.read_key()
, quando usá-las e quando não ...Para Windows, você pode usar
msvcrt
assim:fonte
Use este código para encontrar a tecla pressionada
fonte
Use PyGame para ter uma janela e então você pode obter os principais eventos.
Para a carta
p
:fonte
Então eu fiz esse .. tipo de jogo .. baseado neste post (usando a biblioteca msvcr e Python 3.7).
A seguir está a "função principal" do jogo, que é detectar as teclas pressionadas:
Se você quiser o código-fonte completo do porgrama, você pode vê-lo ou baixá-lo aqui:
O jogo da chave secreta (GitHub)
(nota: a tecla secreta é: Ctrl+F12 )
Espero que possam servir de exemplo e ajudar a quem vier consultar esta informação.
fonte
Eu sugiro que você use PyGame e adicione um identificador de evento.
http://www.pygame.org/docs/ref/event.html
fonte
Isso é do pacote openCV. Ele detecta um pressionamento de tecla sem esperar.
fonte