如何在PySimpleGUI中打开多窗口,各窗口按时间间隔执行同一函数
用PySimpleGUI实现多窗口定时运行的状态监控系统
以下是满足需求的完整实现方案,核心是用线程隔离GUI与任务逻辑,确保多窗口同时运行且状态实时更新:
完整代码示例
import PySimpleGUI as sg import threading import time from datetime import datetime def task_function(window, total_run_hours, interval_seconds): """共享的任务函数,含循环逻辑,按间隔执行直到达到指定运行时长""" end_timestamp = time.time() + total_run_hours * 3600 if total_run_hours > 0 else float('inf') run_count = 0 while time.time() < end_timestamp: run_count += 1 current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") status_msg = f"[{current_time}] 第{run_count}次执行 - 任务运行中..." # 发送状态更新事件到主线程,避免跨线程操作GUI window.write_event_value("-STATUS_UPDATE-", status_msg) # 模拟任务执行耗时(替换为你的实际业务逻辑) time.sleep(1) # 等待下一次执行间隔 if time.time() < end_timestamp: time.sleep(interval_seconds - 1) # 减去任务执行耗时,保证间隔准确 # 任务结束通知 window.write_event_value("-STATUS_UPDATE-", "✅ 任务运行结束") def create_monitor_window(window_num): """创建单个监控窗口,仅包含Multiline输出组件""" layout = [ [sg.Multiline( size=(70, 18), key="-OUTPUT-", autoscroll=True, font=("Consolas", 10) )] ] return sg.Window(f"监控窗口 {window_num}", layout, finalize=True) if __name__ == "__main__": # 配置参数:窗口数量、任务总运行时长(小时)、执行间隔(秒) WINDOW_COUNT = 3 RUN_HOURS = 0.5 # 可设为0到24之间的数值,0表示无限运行(需手动关闭窗口) EXECUTE_INTERVAL = 5 # 每次执行的间隔时间 # 创建所有监控窗口并启动对应线程 windows = [] for idx in range(WINDOW_COUNT): window = create_monitor_window(idx + 1) windows.append(window) # 启动线程,守护线程会随主线程退出而终止 threading.Thread( target=task_function, args=(window, RUN_HOURS, EXECUTE_INTERVAL), daemon=True ).start() # 主线程GUI事件循环 while windows: # 遍历所有窗口处理事件 for window in list(windows): event, values = window.read(timeout=100) if event == sg.WIN_CLOSED: # 关闭窗口并从列表移除 windows.remove(window) window.close() elif event == "-STATUS_UPDATE-": # 更新Multiline组件的状态输出 window["-OUTPUT-"].print(values[event]) print("所有窗口已关闭,程序退出")
关键实现细节
- 线程隔离:每个窗口对应一个独立线程运行任务函数,完全避免GUI线程被阻塞,保证窗口响应流畅。
- 线程安全的GUI更新:通过
window.write_event_value()将状态消息发送到主线程的事件队列,由主线程统一更新Multiline组件,彻底规避跨线程操作GUI的风险。 - 灵活的时长与间隔控制:
RUN_HOURS设为0时,任务会无限循环执行,直到窗口被关闭- 执行间隔通过
EXECUTE_INTERVAL精确控制,任务执行耗时已从间隔中扣除,保证每次执行的时间间隔稳定
- 多窗口管理:通过维护窗口列表,实时处理窗口关闭事件,确保所有窗口关闭后程序正常退出。
- 用户体验优化:Multiline开启自动滚动,使用等宽字体提升状态信息的可读性。
内容的提问来源于stack exchange,提问作者Klaytonpaiva
相关产品推荐
相关产品推荐

