Задержка нажатия клавиши Pynput и Tkinter - PullRequest
1 голос
/ 14 июля 2020

Я просто пытаюсь создать программу, которая будет выполнять ввод с клавиатуры. Я хотел бы установить задержку между каждым нажатием клавиши, которую я планирую сделать случайной в будущем.

Однако я не уверен, как использовать after() с Tkinter. Без Tkinter time.sleep работает нормально, но с ним GUI вылетает.

Любая помощь приветствуется.

import time
import tkinter as tk
from pynput.keyboard import Key, Controller as KeyboardController
from pynput.mouse import Button, Controller as MouseController

keyboard = KeyboardController()
mouse = MouseController()



def copy(a):
    pause_input=17
    pause_input2=2
    pause_input3=0.5
    x=1
    while a >= x:
        x = x+1
        time.sleep(pause_input)
        keyboard.press('t')
        keyboard.release('t')
        time.sleep(pause_input3)
        keyboard.press('e')
        keyboard.release('e')
        time.sleep(pause_input3)
        keyboard.press('s')
        keyboard.release('s')
        keyboard.press('t')
        keyboard.release('t')
        
root = tk.Tk()
root.title("GUI Button")
btn1 = tk.Button(root, text="Button 1", command=lambda : copy(360))
btn2 = tk.Button(root, text="Button 2")

btn1.pack()
btn2.pack()


root.mainloop()
    

1 Ответ

1 голос
/ 14 июля 2020

Во-первых: gui не трескает sh - он отлично работает, а в mainl oop он выполняет команды, которые вы пишете. Он не обновляет sh, потому что выводит вывод вместо обновления пользовательского интерфейса. Первое замечание, которое вы должны помнить при создании пользовательского интерфейса, заключается в том, что вы должны опустить ненужную работу в основном потоке. Возможное решение: переместите работу в отдельный поток и запустите ее там, например:

import time
import tkinter as tk
from pynput.keyboard import Controller as KeyboardController
import threading

keyboard = KeyboardController()

def copy(a):

    def print_test(a):
        pause_input=2
        pause_input2=2
        pause_input3=0.5
        for _ in range(a):
            time.sleep(pause_input)
            keyboard.press('t')
            keyboard.release('t')
            time.sleep(pause_input3)
            keyboard.press('e')
            keyboard.release('e')
            time.sleep(pause_input3)
            keyboard.press('s')
            keyboard.release('s')
            keyboard.press('t')
            keyboard.release('t')
            print("Wrote test")

    t = threading.Thread(target=print_test, args=(a,))
    t.start()
        
root = tk.Tk()
root.title("GUI Button")
btn1 = tk.Button(root, text="Button 1", command=lambda : copy(360))

btn1.pack()

root.mainloop()
...