单键检测,可以增加长输入。

问题描述 投票:2回答:1

上周我一直面临着这个问题,我以为这是个小问题,但在尝试了很多不同的方法后,我不知道还能尝试什么。

我有一个应用程序,我需要有按键检测(用键盘移动机械臂),但当我按下回车键时,我需要添加一些输入,这些输入应该是我想要的长度,只是一些正常的 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()
python input keyboard curses
1个回答
1
投票

如果你想要一个完整的和长的用户输入,你将需要使用的是 curses.echo() 然后使用 stdscr.getstr(). 这将等待用户按enter()。为了在输入时不阻止程序的运行,你需要使用 threading 您必须在程序的顶部导入它

而对于线程 此处 是一个链接,你可以找到更多关于穿线的信息。


我希望它能回答你的问题

© www.soinside.com 2019 - 2024. All rights reserved.