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

如何实现关闭Webview时自动终止Flask服务

解决关闭WebView时自动终止Flask服务的问题

原代码中WebView窗口关闭后,Flask服务会持续运行,原因是app.run()为阻塞式执行,且没有触发服务停止的逻辑。以下是修复后的完整代码:

from tkinter import *
from threading import Thread
from flask import Flask, render_template, request
import webview
import requests

app = Flask(__name__)

tk = Tk()
tk.geometry("800x450")

webview.create_window('TITLE', 'http://127.0.0.1:5000/')

@app.route('/')
def hello_world():
    return render_template('index.html', message='Hello, World!')

@app.route('/shutdown', methods=['POST'])
def shutdown():
    # 调用Werkzeug内置方法终止服务器
    func = request.environ.get('werkzeug.server.shutdown')
    if func:
        func()
    return "Server shutting down..."

def run_flask_app():
    # 关闭自动重载,避免生成额外进程导致无法彻底终止
    app.run(use_reloader=False)

def main():
    flask_thread = Thread(target=run_flask_app)
    flask_thread.start()

    # webview.start()会阻塞执行,直到窗口被关闭
    webview.start()

    # 窗口关闭后,发送请求终止Flask服务
    try:
        requests.post('http://127.0.0.1:5000/shutdown')
    except requests.exceptions.ConnectionError:
        # 服务已关闭时忽略连接异常
        pass
    flask_thread.join()

if __name__ == "__main__":
    main()

关键修改说明

  • 新增/shutdown路由:借助Werkzeug框架提供的werkzeug.server.shutdown方法,接收请求后直接终止Flask服务
  • 关闭Flask自动重载:启动服务时添加use_reloader=False,防止自动重载机制创建额外进程,导致服务无法彻底停止
  • 窗口关闭触发终止:webview.start()执行完成代表窗口已关闭,此时发送POST请求到/shutdown路由,主动停止Flask服务
  • 异常捕获:处理连接错误,避免服务已经关闭时抛出不必要的异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:09