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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:45:36