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

Python Eel应用程序窗口隐藏与显示问题求助

解决Python Eel应用窗口隐藏与定时唤起问题

核心问题分析

Eel提供了eel.show()唤起窗口,但官方API没有直接的eel.hide()方法,因此需要借助系统级窗口控制实现隐藏,同时结合定时任务完成条件触发与新任务加载。

解决方案步骤

1. 依赖准备

根据操作系统安装对应工具:

  • Windows:安装pywin32库用于窗口句柄操作
  • Linux:通过包管理器安装wmctrl工具(如apt install wmctrl)
  • macOS:无需额外安装,使用系统自带osascript
  • 通用:安装schedule库处理定时任务
# 通用依赖
pip install eel schedule
# Windows额外安装
pip install pywin32

2. Python端实现窗口隐藏与定时逻辑

import eel
import schedule
import time
import sys
import threading

# 根据操作系统导入窗口控制模块
if sys.platform == 'win32':
    import win32gui
elif sys.platform in ['linux', 'darwin']:
    import subprocess

# 初始化Eel前端目录
eel.init('web')

# 唯一窗口标题,启动时指定,确保能精准定位窗口
WINDOW_TITLE = "任务部署应用"

def get_window_handle():
    """获取应用窗口句柄(仅Windows)"""
    if sys.platform == 'win32':
        return win32gui.FindWindow(None, WINDOW_TITLE)
    return None

@eel.expose
def hide_app_window():
    """隐藏应用窗口,供前端调用"""
    if sys.platform == 'win32':
        hwnd = get_window_handle()
        if hwnd:
            win32gui.ShowWindow(hwnd, 0)  # 0代表隐藏窗口
    elif sys.platform == 'linux':
        subprocess.run(["wmctrl", "-r", WINDOW_TITLE, "-b", "add,hidden"])
    elif sys.platform == 'darwin':
        # macOS下Eel窗口关联Chromium,需匹配实际应用名称
        subprocess.run(["osascript", "-e", f'tell application "Chromium" to set visible of window titled "{WINDOW_TITLE}" to false'])

def load_new_tasks():
    """从SQL数据库读取新任务列表,替换为你的实际查询逻辑"""
    # 示例SQL查询逻辑(以SQLite为例)
    import sqlite3
    conn = sqlite3.connect('tasks.db')
    cursor = conn.cursor()
    cursor.execute("SELECT id, name, task_time FROM tasks WHERE status = 'pending'")
    tasks = [{"id": row[0], "name": row[1], "time": row[2]} for row in cursor.fetchall()]
    conn.close()
    return tasks

def check_and_show_window():
    """检查时间条件,满足则唤起窗口并加载新任务"""
    # 替换为你的时间判断逻辑,比如对比当前时间与任务触发时间
    current_time = time.strftime("%Y-%m-%d %H:%M")
    # 示例:假设从数据库读取的目标时间
    target_time = "2024-05-20 14:00"
    if current_time == target_time:
        eel.show()
        new_tasks = load_new_tasks()
        eel.update_task_list(new_tasks)  # 前端需实现此函数更新页面

def run_schedule_loop():
    """后台运行定时任务循环"""
    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == '__main__':
    # 启动定时任务线程
    threading.Thread(target=run_schedule_loop, daemon=True).start()
    
    # 启动Eel应用,配置窗口参数
    eel.start(
        'index.html',
        mode='False',
        title=WINDOW_TITLE,
        size=(800, 600)
    )
    # 保持Eel进程运行
    eel.sleep(1000000)

3. 前端(HTML/JS)交互实现

<!-- web/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>任务部署应用</title>
</head>
<body>
    <h1>待处理任务</h1>
    <ul id="taskList"></ul>
    <button onclick="hideWindow()">完成操作,隐藏窗口</button>

    <script type="text/javascript" src="/eel.js"></script>
    <script>
        // 接收Python传递的新任务并更新页面
        eel.expose(update_task_list);
        function update_task_list(tasks) {
            const taskList = document.getElementById('taskList');
            taskList.innerHTML = '';
            tasks.forEach(task => {
                const li = document.createElement('li');
                li.textContent = `${task.name} - 执行时间:${task.time}`;
                taskList.appendChild(li);
            });
        }

        // 调用Python的窗口隐藏函数
        function hideWindow() {
            eel.hide_app_window();
        }
    </script>
</body>
</html>

关键注意事项

  • 窗口标题必须唯一,避免误操作其他同名窗口
  • macOS下需确认Eel关联的浏览器名称(可能是Chrome/Chromium),调整osascript中的应用名
  • 定时任务必须放在独立线程,避免阻塞Eel主线程
  • SQL数据读取逻辑需根据你的数据库类型(MySQL、PostgreSQL等)做对应调整

内容的提问来源于stack exchange,提问作者juanjo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:58:15