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

如何实现监控与控制pyautogui进程的置顶控制面板?

实现可置顶的PyAutoGUI监控控制面板

需求概述

需要一个可置顶的小型控制面板窗口,实现两个核心功能:

  • 实时展示logging模块生成的日志内容
  • 提供暂停、恢复按钮,用于调试PyAutoGUI执行进程

修改后的完整代码

1. main.py

整合GUI、日志配置与线程控制逻辑:

import datetime
import logging
from tkinter import Tk, Text, Button, Frame, Scrollbar, END
import threading
from executes import execute

# 全局控制事件,用于暂停/恢复线程
pause_event = threading.Event()
pause_event.set()  # 默认处于可执行状态

class TextHandler(logging.Handler):
    """自定义日志处理器,将日志输出到Tkinter文本框"""
    def __init__(self, text_widget):
        super().__init__()
        self.text_widget = text_widget

    def emit(self, record):
        msg = self.format(record)
        self.text_widget.configure(state='normal')
        self.text_widget.insert(END, msg + '\n')
        self.text_widget.configure(state='disabled')
        # 自动滚动到最新日志
        self.text_widget.yview(END)

def toggle_pause():
    """切换暂停/恢复状态"""
    if pause_event.is_set():
        pause_event.clear()
        pause_btn.config(text="恢复")
    else:
        pause_event.set()
        pause_btn.config(text="暂停")

def run_bot():
    """在子线程中运行PyAutoGUI任务"""
    try:
        execute(pause_event)
        logging.info("任务执行完成")
    except Exception as e:
        logging.error(f"任务执行出错: {str(e)}")

if __name__ == '__main__':
    # 初始化GUI窗口
    root = Tk()
    root.title("PyAutoGUI监控面板")
    root.attributes('-topmost', True)  # 设置窗口置顶
    root.geometry("500x400")

    # 日志显示区域
    log_frame = Frame(root)
    log_frame.pack(fill="both", expand=True, padx=5, pady=5)

    scrollbar = Scrollbar(log_frame)
    scrollbar.pack(side="right", fill="y")

    log_text = Text(log_frame, wrap="word", state='disabled', yscrollcommand=scrollbar.set)
    log_text.pack(fill="both", expand=True)
    scrollbar.config(command=log_text.yview)

    # 控制面板
    control_frame = Frame(root)
    control_frame.pack(fill="x", padx=5, pady=2)

    pause_btn = Button(control_frame, text="暂停", command=toggle_pause)
    pause_btn.pack(side="left", padx=2)

    # 配置日志:同时输出到文件和GUI文本框
    current_time = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
    logging.basicConfig(
        level=logging.DEBUG,
        format='%(asctime)s - %(levelname)s - %(message)s',
        handlers=[
            logging.FileHandler(f'./log/bot_{current_time}.log'),
            TextHandler(log_text)
        ]
    )

    # 启动任务线程
    bot_thread = threading.Thread(target=run_bot)
    bot_thread.daemon = True  # 主线程退出时子线程自动结束
    bot_thread.start()

    logging.info("程序启动,监控面板已开启")
    root.mainloop()

2. executes.py

修改执行函数,接收暂停事件参数,传递给动作函数:

'''
执行流程定义,调用actions.py中的动作
'''
from actions import open_firefox, open_new_tab

def execute(pause_event):
    """主执行函数,支持暂停/恢复控制"""
    open_firefox(pause_event)
    open_new_tab(pause_event)

3. actions.py

修改动作函数,添加暂停检查逻辑:

'''
PyAutoGUI动作定义,支持暂停控制
'''
from time import sleep
import logging
import pyautogui as pag

def check_pause(pause_event):
    """检查是否需要暂停,若暂停则阻塞直到恢复"""
    while not pause_event.is_set():
        sleep(0.1)

def open_firefox(pause_event):
    """打开Firefox浏览器"""
    logging.info('开始打开Firefox浏览器')
    check_pause(pause_event)
    
    firefox_icon_location = pag.locateCenterOnScreen('./asset/firefox.png', confidence=0.75)
    if not firefox_icon_location:
        logging.error('未找到Firefox图标')
        return
    
    check_pause(pause_event)
    pag.moveTo(firefox_icon_location, duration=1)
    
    check_pause(pause_event)
    sleep(1)
    pag.leftClick()
    
    check_pause(pause_event)
    sleep(1)
    logging.info('Firefox浏览器已打开')

def open_new_tab(pause_event):
    """打开新标签页"""
    check_pause(pause_event)
    pag.hotkey('ctrl', 't')
    
    check_pause(pause_event)
    sleep(1)
    logging.info('已打开新标签页')

核心逻辑说明

  1. 置顶窗口:通过root.attributes('-topmost', True)让Tkinter窗口始终处于所有窗口顶层。
  2. 实时日志:自定义TextHandler类,将日志同时输出到文件和GUI文本框,自动滚动到最新内容。
  3. 暂停/恢复:使用threading.Event作为控制信号,在每个动作的关键步骤前检查暂停状态,若处于暂停则阻塞线程直到恢复。
  4. 线程隔离:将PyAutoGUI任务放到子线程执行,避免GUI界面因同步任务而卡死。

使用方法

  1. 确保./asset/firefox.png路径存在,且为Firefox图标的清晰截图。
  2. 运行main.py,弹出的置顶窗口会实时展示日志内容。
  3. 点击「暂停」按钮可中断PyAutoGUI执行,点击「恢复」可继续后续步骤。

内容的提问来源于stack exchange,提问作者Muhammad Ikhwan Perwira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:07:18