【问题标题】:Pynput key press delay and TkinterPynput 按键延迟和 Tkinter
【发布时间】:2020-11-03 06:11:35
【问题描述】:

我只是想制作一个可以执行一些键盘输入的程序。我想在每次击键之间设置一个延迟,我打算在未来随机化。

但是,我不确定如何将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()
    

【问题讨论】:

    标签: python tkinter pynput


    【解决方案1】:

    首先:gui 不会崩溃 - 它工作正常,并且在 mainloop 中它执行您正在编写的命令。它不刷新,因为它打印输出而不是刷新 UI。在创建 UI 时需要记住的第一个注意事项是,您应该省略主线程中不必要的工作。 可能的解决方案: 将工作移动到单独的线程并在那里运行,例如:

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

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2020-05-05
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多