如何使用 Python 暂时禁用键盘输入

Posted

技术标签:

【中文标题】如何使用 Python 暂时禁用键盘输入【英文标题】:How to temporarily disable keyboard input using Python 【发布时间】:2015-03-26 22:19:37 【问题描述】:

我正在使用 Python 为 Windows 编写一个简单的程序,该程序利用了time 模块。具体来说,我使用time.sleep(x) 来暂停程序一小会儿,一般是0.5-2 秒。这基本上就是我正在做的事情:

import time
time.sleep(2)

while True:
    x = input(prompt)
    if x == 'spam':
        break

问题在于,如果用户在time.sleep 暂停时按下回车,那么这些回车将计入while 循环中的输入。这导致prompt 被打印多次,令人沮丧。

我想知道是否有办法在time.sleep 进行时暂时禁用键盘输入,然后再启用它。像这样的:

import time
disable_keyboard_input()
time.sleep(2)
enable_keyboard_input()

while True:
    etc.

有谁知道用 Python 来做这件事的方法吗?提前谢谢!

【问题讨论】:

***.com/questions/2520893/… 几乎是重复的 @Maltysen 这种方法对我不起作用:( while msvcrt.kbhit(): msvcrt.getwch() 应该可以在睡眠后清除键盘缓冲区。需要注意的是,这仅在 stdin 是 Windows 控制台时有效,而不是在将 sys.stdin 替换为管道或类似文件的对象的开发环境中。 @eryksun 非常感谢,成功了!我没有尝试通过控制台运行它,因为我不知道它改变了sys.stdin 的工作方式。现在完美运行,非常感谢! :D 也是disable or lock mouse and keyboard in Python?的副本 【参考方案1】:

我发现这非常有效:

import time
class keyboardDisable():

    def start(self):
        self.on = True

    def stop(self):
        self.on = False

    def __call__(self): 
        while self.on:
            msvcrt.getwch()


    def __init__(self):
        self.on = False
        import msvcrt

disable = keyboardDisable()
disable.start()
time.sleep(10)
disable.stop()

它阻止用户输入任何内容;当您按下键盘上的某个键时,什么也没有发生。

【讨论】:

我将此代码集成到我的一个程序中,它非常有用。我的问题是,它到底是如何工作的? @pythonier500 首先,抱歉回复晚了。代码通过不断运行 msvcrt.getwch() 来工作,它返回在字符打印到屏幕上之前按下的键。通常,这将用于在以某种方式修改后打印字符的代码中,但在这种情况下,返回的值被忽略。如果您改为打印它,您将能够正常输入。 TLRD:它在显示之前拦截密钥 上面的代码通常会禁用键盘输入,还是仅在 shell 或 cmd 中禁用?此外,如果我理解得很好,我们想要得到的结果是禁用键盘上的任何输入 10 秒。 它只能在 python 的 shell/cmd 中工作,并且只能阻止在那里显示的字符。如果你想停止所有键盘输入,那就更难了。它只是让python忽略按键,从而解决了OP的问题 好的,谢谢@mono,如果特定条件为真,我试图抑制不停止键盘输入,但很挣扎。【参考方案2】:

试试这个。

stdout = sys.stdout
sys.stdout = sys.stderr
time.sleep(2)

sys.stdout = stdout

while True:
    pass

没试过这个。但我希望在 sleep 结束之前输入的所有内容都会发送到 stderr ......不确定,但也许 Python 可以访问 linux 的 std/null ?

【讨论】:

【参考方案3】:

如果您使用它来制作真正的软件并且只想在输出屏幕中禁用键盘输入,那么其他 2 个答案是完美的。但是,如果是个人使用或者你想禁用整个系统的键盘,你可以使用这个代码:

import keyboard
import time
a = int(input("Enter the time (in seconds) for which you want to disable keyboard: "))
for i in range(150):
    keyboard.block_key(i)
time.sleep(a)

在执行这段代码之前不要忘记在终端中运行pip install keyboard,否则会报错。

【讨论】:

以上是关于如何使用 Python 暂时禁用键盘输入的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式禁用鼠标和键盘

如何在Linux下禁用键盘,触摸板,鼠标等输入设备

在linux上禁用python中的键盘

Python中如何从键盘中输入字符串,统计字母,数字,符号和空格的个数?

如何禁用手机自带的输入法软键盘

在 EditText 中阻止物理键盘输入