You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中While循环运行时如何通过DearPyGui按钮终止循环

问题解决方法

你的核心问题是同步while循环阻塞了主线程,导致DearPyGui的界面事件循环无法处理按钮点击操作,自然没法修改变量终止循环。下面是具体的修复方案:

核心思路

把自动点击的循环放到子线程中执行,让主线程专门处理界面交互;同时用threading.Event替代全局变量,更安全可靠地控制循环启停。

修改后的完整代码

import pyautogui
import time
import threading
import dearpygui.dearpygui as dpg

# 用Event替代全局变量,初始状态为激活(set())
enabled_event = threading.Event()
enabled_event.set()

def stopautoclick():
    # 清除事件,终止循环
    enabled_event.clear()

def autoclick(button, delay, coordX, coordY):
    mousebutton = button
    match mousebutton:
        case "Esquerdo":
            mousebutton = "left"
        case "Direito":
            mousebutton =  "right"
        case "Centro":
            mousebutton = "middle"
    print(mousebutton)
    time.sleep(delay)
    # 循环判断事件是否激活,wait(delay)替代time.sleep,能被及时唤醒
    while enabled_event.is_set():       
        pyautogui.click(x=coordX, y=coordY, button=mousebutton)
        # 用Event的wait方法,比time.sleep更灵活,收到终止信号会立刻退出
        if not enabled_event.wait(delay):
            break

# 启动自动点击的函数,用于在子线程中执行
def start_autoclick():
    # 这里替换成你的实际参数
    autoclick("Esquerdo", 0.5, 100, 100)
    # 循环结束后可以重置事件,方便再次启动(可选)
    enabled_event.set()

# 初始化DearPyGui界面
dpg.create_context()
dpg.create_viewport(title="Auto Clicker", width=300, height=200)

with dpg.window(label="Auto Clicker"):
    # 修正按钮回调:直接传函数名,或者用lambda调用(注意加括号)
    dpg.add_button(label="Parar Auto Click", callback=stopautoclick)
    # 添加启动按钮(可选,用于触发自动点击)
    dpg.add_button(label="Iniciar Auto Click", callback=lambda: threading.Thread(target=start_autoclick, daemon=True).start())

dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

关键修改点说明

  1. 线程分离:用threading.Thread把autoclick放到子线程运行,主线程专注处理界面事件,避免阻塞。
  2. 替换全局变量:threading.Event比普通全局变量更适合线程间通信,is_set()判断是否继续循环,clear()终止循环,wait(delay)替代time.sleep(),能在收到终止信号时立刻退出,不需要等待sleep结束。
  3. 修正按钮回调:你原来的lambda: stopautoclick只是引用函数没有调用,正确写法是lambda: stopautoclick()或者直接传callback=stopautoclick(因为DearPyGui回调默认会传参数,但这里函数不需要,所以可以直接用)。
  4. 守护线程:创建线程时加daemon=True,保证程序退出时子线程会自动终止,避免残留。

内容的提问来源于stack exchange,提问作者João Textor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:23:29