9

I'm writing a simple program for Windows using Python, and this program takes advantage of the time module. Specifically, I'm using time.sleep(x) to pause the program for a short moment, generally 0.5-2 seconds. Here's basically what I'm doing:

import time
time.sleep(2)

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

The problem with this is, if the user presses enter while time.sleep has it paused, then those enters will be counted towards the input in the while loop. This results in prompt being printed several times, which is frustrating.

I want to know if there's a way to temporarily disable keyboard input while time.sleep is going on, and then enable it afterwards. Something like this:

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

while True:
    etc.

Does anyone know of a way to do this using Python? Thank you in advance!

5
  • stackoverflow.com/questions/2520893/… pretty much a duplicate Commented Mar 26, 2015 at 22:26
  • @Maltysen That method didn't work for me :( Commented Mar 26, 2015 at 22:47
  • while msvcrt.kbhit(): msvcrt.getwch() should work to clear the keyboard buffer after sleeping. The caveat is that this only works when stdin is the Windows console, not in development environments that replace sys.stdin with a pipe or file-like object. Commented Mar 28, 2015 at 2:23
  • @eryksun Thank you so much, that worked! I didn't try running it through the console because I didn't know that it changed how sys.stdin worked. It works perfectly now, thank you so much! :D Commented Mar 28, 2015 at 20:06
  • Also a duplicate of disable or lock mouse and keyboard in Python? Commented Nov 11, 2019 at 1:09

3 Answers 3

4

I found this worked brilliantly:

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()

It stops the user from typing anything; when you press a key on the keyboard, nothing happens.

Sign up to request clarification or add additional context in comments.

6 Comments

I integrated this code in one of my programs and it is really useful. My question is, exactly how does it work?
@pythonier500 first of all, sorry for the late reply. The code works by constantly running msvcrt.getwch(), which returns the key pressed before the character is printed on screen. Generally, this would be used in code where the character is printed after being modified somehow, but in this case the value returned is ignored. If you were to instead print it, you would be able to type normally. TLRD: It intercepts the key before it is displayed
Does the code above generally disables the input from keyboard, or only in a shell or cmd ? Moreover if I understand well the result that we want to get is to disable ANY input from keyboard for 10 seconds.
It only works within the shell/cmd of python, and only works to stop characters being displayed there. If you want to stop all keyboard input, thats much harder. It just makes python ignore keypresses, which solves OP's problem
Okk thanks @mono , I am trying to suppress not stop the keyboard input if a specific condition is True, but struggling a lot.
|
4

The other 2 answers are perfect if you are using it to make a real software and want to disable keyboard input only in the output screen. However, if it's for personal usage or you want to disable the keyboard for the whole system, you can use this code:

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)

Don't forget to run pip install keyboard in the terminal before executing this code otherwise, you will get an error.

Comments

-1

Try this.

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

sys.stdout = stdout

while True:
    pass

Didn't tried this. But I hope all that was typed before sleep is ended will sended to stderr... Don't sure, but maybe Python have access to linux's std/null?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.