如何实现监控与控制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('已打开新标签页')
核心逻辑说明
- 置顶窗口:通过
root.attributes('-topmost', True)让Tkinter窗口始终处于所有窗口顶层。 - 实时日志:自定义
TextHandler类,将日志同时输出到文件和GUI文本框,自动滚动到最新内容。 - 暂停/恢复:使用
threading.Event作为控制信号,在每个动作的关键步骤前检查暂停状态,若处于暂停则阻塞线程直到恢复。 - 线程隔离:将PyAutoGUI任务放到子线程执行,避免GUI界面因同步任务而卡死。
使用方法
- 确保
./asset/firefox.png路径存在,且为Firefox图标的清晰截图。 - 运行
main.py,弹出的置顶窗口会实时展示日志内容。 - 点击「暂停」按钮可中断PyAutoGUI执行,点击「恢复」可继续后续步骤。
内容的提问来源于stack exchange,提问作者Muhammad Ikhwan Perwira
相关产品推荐
相关产品推荐

