上周我一直面临着这个问题,我以为这是个小问题,但在尝试了很多不同的方法后,我不知道还能尝试什么。
我有一个应用程序,我需要有按键检测(用键盘移动机械臂),但当我按下回车键时,我需要添加一些输入,这些输入应该是我想要的长度,只是一些正常的 input("insert here")
.
我知道用python库来获得按键检测,我让pynput成功地工作了,但是当我启动和停止线程时,它让我的raspberry pi崩溃了几次,我试过键盘库,但是整个根部要求是让人失望的,我也让curses工作了,这似乎是坚实的,并且(几乎)没有引起任何问题,所以检测1个键不是问题。
我当然知道如何给我的文件命名,并通过做input()来获取我所需要的所有信息,所以如果我必须使用其中的一个选项,工作会相当简单,当我试图将这两种方法一起应用时,挑战就来了,基本上检测键来做我所需要的一切,并使用python输入来获取用户的所有输入,只要按下回车键,所有检测键的库似乎完全控制了它,它们不想不战而屈人之兵。他们似乎希望用户总是需要单键检测,但在我的情况下,我需要不断地打开和关闭它,我想不出任何有效(或不)的方法来让它正常工作。
我的问题是。
什么是最好的方法来实现按键检测+用户输入,当需要的时候,用诅咒(或任何替代方法)以一种非阻塞的方式(因为我的代码需要在监听按键的同时做一些其他事情),创建和破坏整个事情是唯一的选择吗?
这是我目前的测试代码,我为了简化而创建的(它可以工作,但在监听键的时候会阻塞一切)。
import curses
import time
import os
stdscr = None
addInput = False
def SetupCurses():
global stdscr
stdscr = curses.initscr()
curses.cbreak()
stdscr.keypad(1)
def StartCurse():
global addInput
key = ''
while key != ord('q'):
key = stdscr.getch()
stdscr.addstr(str(key))
if key == ord('a'):
print("\nyou pressed a\n")
if key == 10:
print("\nyou pressed enter!\n")
addInput = True
break
def EndCurse():
curses.endwin()
while(True):
SetupCurses()
StartCurse()
EndCurse()
if addInput:
theinput = input("add your input\n")
print(theinput)
time.sleep(4)
addInput = False
#if there isn't any input to add I want the code to continue because there is non-related keys stuff to do, but of course it stopped at "StartCurse"
#if there is something to add the code can stop at addInput
循环的原因是用户可以保存任意多的位置 所以在添加了一些输入之后,还有可能添加更多的位置。
我看到有人通过在几秒钟后关闭诅咒循环(反正一切都停止了......)来使这个非阻塞,有点像靠运气获得输入......类似的东西。
def ExecuteCurses():
global AddInput
#open it and close it very quickly to grab a key if it is pressed
c = stdscr.getch()
if c == ord('a'):
print("you pressed a")
AddInput = True
time.sleep(1)
curses.endwin()
如果你想要一个完整的和长的用户输入,你将需要使用的是 curses.echo()
然后使用 stdscr.getstr()
. 这将等待用户按enter()。为了在输入时不阻止程序的运行,你需要使用 threading
您必须在程序的顶部导入它
而对于线程 此处 是一个链接,你可以找到更多关于穿线的信息。
我希望它能回答你的问题