在我的 tkinter 和 pyautogui 程序中,GUI 不断崩溃

问题描述 投票:0回答:1
window= Tk()
window.geometry("600x400")
window.title("autoclicker")

onoff = StringVar()
onoff.set("the autoclicker is off")

onoroff= Label(window, textvariable=onoff, font=("arial", 10))
onoroff.pack()

inf=1
y=input("how many secconds? : ")
y=float(y)
print("press x to start and p to stop")
while inf==1:
    keyboard.wait("x")
    onoff.set("the autoclicker is on")
    print("autoclicker started")
    while not keyboard.is_pressed("p"):
        click()
        time.sleep(y)
    print("autoclicker stopped")
    onoff.set("the autoclicker is off")

window.mainloop()

我用谷歌搜索了一下,没有找到任何结果 我是Python新手,我试图制作一个自动点击器程序,在GUI中它会显示自动点击器是否启动(我昨天开始)

python tkinter pyautogui
1个回答
0
投票

理想情况下,

tkinter
程序不应有
while
循环或其他阻塞调用(您有:
keyboard.wait("x")
),因为这些会使图形用户界面无响应。

下面的代码使用

window.mainloop()
来允许
tkinter
自己管理所有事件。例如,这意味着关闭主窗口会退出程序,从而清理其他所有内容。

我使用的机制是

.after()
方法,它允许
tkinter
将来执行任意功能,同时保持响应能力。

import tkinter as tk
import keyboard
from pyautogui import click
import time

state = 1


def clicker(window, y_ms):
    if state == 2:
        click()
        window.after(y_ms, lambda: clicker(window, y_ms))


def states(window, onoff, y_ms):
    global state
    if state == 1:
        if keyboard.is_pressed('x'):
            onoff.set("the autoclicker is on")
            state = 2
            window.after(y_ms, lambda: clicker(window, y_ms))
    elif state == 2:
        if keyboard.is_pressed('p'):
            onoff.set("the autoclicker is off")
            state = 1
    window.after(10, lambda: states(window, onoff, y_ms))


def main():
    y_ms = int(float(input("how many seconds? ")) * 1000)
    print("press x to start and p to stop")
    window = tk.Tk()
    window.geometry("600x400")
    window.title("autoclicker")

    onoff = tk.StringVar()
    onoff.set("the autoclicker is off")

    onoroff = tk.Label(window, textvariable=onoff, font=("arial", 10))
    onoroff.pack()

    window.after(10, lambda: states(window, onoff, y_ms))
    window.mainloop()


if __name__ == '__main__':
    main()
    print('Done')
© www.soinside.com 2019 - 2024. All rights reserved.