【问题标题】:Tkinter gui doesn't work Mouse and keyboard modulesTkinter gui 不起作用鼠标和键盘模块
【发布时间】:2021-08-18 03:00:11
【问题描述】:

我试图使用鼠标和键盘模块以及 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')

我该怎么办?

【问题讨论】:

  • 在使用tkinter 时不应使用keyboard/mouse 模块。而是查看tkinter 事件绑定。
  • while 将阻止 mainloop 更新 GUI。
  • @TheLizzard 可以 tkinter 事件绑定自动按键吗?
  • @CoolCloud 我删除了但仍然没有发生任何事情
  • @AmirTheDev 我建议你看一个 tkinter 教程。要使用 tkinter 的事件绑定,您需要传入一个函数,当按下鼠标/键盘按钮等事情发生时 tkinter 会调用该函数。

标签: python tkinter keyboard mouse


【解决方案1】:

GUI 不显示的原因是在代码到达mainloop() 之前,它进入了一个无限循环(while 循环),它无法到达mainloop,因此没有显示窗口,也没有显示事件处理。所以你应该做的是摆脱while。一种方法是使用after() 方法来模拟while

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

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

【讨论】:

    【解决方案2】:

    您不应该在 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')
    

    【讨论】:

    • 虽然这确实有效,但这不是我所需要的,我需要不断点击按钮 d @CoolCloud 确实给了我另一个成功的答案,但感谢您花时间审查我的代码。
    • @AmirTheDev 如果按住“q”键,回调将继续执行。
    • 这可以工作,但它仍然不是我需要的,我想做一个不需要人按东西的自动点击器。
    • @AmirTheDev 那我想知道为什么你的代码一直在检查kb.is_pressed("q")
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多