Tkinter gui 不工作鼠标和键盘模块

Tkinter gui doesn't work Mouse and keyboard modules

我试图使用鼠标和键盘模块和 tkinter 作为 gui 制作一个自动点击器并编写了这段代码

#Import
import tkinter as tk
import random as r8
import keyboard as kb
import mouse as ms

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()
        self.joesd()

    def create_widgets(self):
        self.joe = tk.Frame(self)#main frame
        self.joe.pack(fill=tk.BOTH)
        self.lbl = tk.Label(self.joe, text='Example text', height=5, width=30)
        self.lbl.pack(side="top")# where the label will be located
        self.lb = tk.Label(self.joe, text='Example Text', height=5, width=35)
        self.lb.pack(side="top")# where the label will be located
    def joesd(self):
        while True:
            if kb.is_pressed('q') == True:
                ms.press('left')
                ms.release('left')

root = tk.Tk() 
app = Application(master=root)
app.mainloop()

然后我注意到 gui 从未出现,但如果我删除它就会出现

    def joesd(self):
        while True:
            if kb.is_pressed('q') == True:
                ms.press('left')
                ms.release('left')

我该怎么办?

GUI 不显示的原因是在代码命中 mainloop() 之前它进入了无限循环(while 循环)并且它无法到达 mainloop 因此 window 不显示并且不处理事件。所以你应该做的是摆脱while。一种方法是使用 after() 方法来模拟 while.

def joesd(self):
    if kb.is_pressed('q'):
        ms.press('left')
        ms.release('left')
        
    self.after(100,self.joesd)

这将每 100 毫秒重复一次该功能,您也可以将其减少到 1 毫秒。但请确保系统无法处理。

您不应在 tkinter 应用程序中使用 while 循环。您可以使用 kb.on_press_key() 注册回调:

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        ...
        #self.joesd() # <- not necessary
        kb.on_press_key("q", self.on_key_press)

    ...

    def on_key_press(self, event):
        #print("q pressed", event)
        ms.press('left')
        ms.release('left')
        # above two lines can be replaced by ms.click('left')