Home > Net >  Detect NO KEY PRESSES with keyboard module python
Detect NO KEY PRESSES with keyboard module python

Time:09-06

I'm making a tkinter program and want to detect a key press and do something when there is, however if no key is pressed the keyboard.read_key() will not execute and not let any other code run until a key is pressed.

Is there an alternative I can use or a way to check if no key was pressed?

def on_press():
    global running
    global turn

    if keyboard.read_key() == 'q':
        ws.destroy()
    elif keyboard.read_key() == 'a':
        if turn:
            print('turning off')
            running = False
            turn = False

        else:
            print('turning on')
            running = True
            turn = True
            start()
    else:
        start()

def start():
    global running
    global turn
    print('start')
    if running:
        print('clicking')
        mouse.click(Button.left, cps_val)
        time.sleep(1)
        on_press()
    on_press()

CodePudding user response:

Key is no pressed for the most of the time. Because computer is fast and human is slow so I would assumed that that key is no pressed at the beginnig and I would run code at once (without checking if it no pressed). And I would run "clicking code" all time in while at the beginning and I would use keys only to pause this loop (key a) or exit this loop (key q) - without checking if key is no pressed.

import keyboard
#import mouse
import time

# --- functions ---

def pause():
    global turn

    if turn:
        print('turning off')
        turn = False
    else:
        print('turning on')
        turn = True

def finish():
    global running
    
    running = False

def main():
    global counter
    
    print('start')

    while running:
        if turn:
            counter  = 1
            print('clicking', counter)
            #mouse.click(Button.left, cps_val)
            time.sleep(1)
            
# --- main ---

turn = True
running = True

counter = 0

keyboard.add_hotkey('q', finish)
keyboard.add_hotkey('a', pause)

main()

If it has to run with tkinter then while loop will block tkinter (tkinter will freeze because it will have no time to get key/mouse events from system, send them to widgets, update widgets, and redraw widgets in window).

I would use tkinter.after(milliseconds, function) instead of sleep() and while and tkinter will have time to work.

import tkinter as tk
import keyboard
#import mouse
import time

# --- functions ---

def pause():
    global turn

    if turn:
        print('turning off')
        turn = False
    else:
        print('turning on')
        turn = True

def finish():
    global running
    
    running = False
    
    root.destroy()

def main():
    print('start')
    
    loop()                   # run first time at once
    #root.after(1000, loop)  # run first time after 1s

def loop():
    global counter
    
    if turn:
        counter  = 1
        #print('clicking', counter)
        label['text'] = f'clicking {counter}'
        #mouse.click(Button.left, cps_val)
        
    if running:
        root.after(1000, loop)  # run again after 1s
          
        
# --- main ---

turn = True
running = True

counter = 0

keyboard.add_hotkey('q', finish)
keyboard.add_hotkey('a', pause)

root = tk.Tk()

label = tk.Label(root, text='clicking 0')
label.pack()

main()

root.mainloop()
  • Related