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

Python Tkinter+Flask开发Web服务生成器双窗口及无返回问题排查

问题根因

1. 出现双窗口的两个核心原因

  • 你导入了tkinter.tix模块的Button组件,tix模块初始化时会自动创建一个隐藏的Tk根窗口,和你后续显式创建的self.root = Tk()形成两个窗口实例
  • 你开启了Flask的debug模式,debug模式默认会启用自动重载器,会启动第二个子进程重新执行整个脚本,再次实例化Tk窗口

2. Flask服务无返回、UI无响应的原因

Flask的run()方法是阻塞同步执行的,你直接在Tkinter的主线程中启动Flask,会直接阻塞Tkinter的主事件循环,导致UI完全卡死,Text组件的内容无法正常读取,请求也得不到响应。

修复方案

第一步:修正导入逻辑,移除tix依赖

把原有导入中tix相关的部分替换为标准tkinter组件,修正不规范的tk导入写法:

# 删掉这行:from tkinter.tix import Button
# 修正tk导入写法
from tkinter import Tk, StringVar, Text, Button, font
from tkinter.ttk import Label, Entry, Notebook, Frame, Combobox
from tkinter.constants import RAISED, FLAT, BOTH, CENTER, RIDGE, END

第二步:将Flask放入子线程启动,关闭重载器

修改ButtonEventClicker函数,用子线程跑Flask服务,同时关闭debug模式的自动重载:

import threading # 顶部新增导入threading模块

# 原有ButtonEventClicker修改为:
def ButtonEventClicker():
    def run_flask():
        try:
            # 关闭use_reloader防止双进程,debug可按需开启
            self.flaskServer.run(
                host = "0.0.0.0",
                port = 8080,
                debug = True,
                use_reloader = False
            )
        except Exception as e:
            self.outputTerminal.insert(END, f"\n服务启动错误:{str(e)}")
    # 启动守护线程跑Flask,不阻塞主线程
    flask_thread = threading.Thread(target=run_flask, daemon=True)
    flask_thread.start()
    self.outputTerminal.insert(END, f"\n[{strftime('%H:%M:%S %p')}] 服务已启动,访问 http://localhost:8080 查看内容")

第三步:可选优化

如果你不需要Text返回末尾的自动换行,可以修改路由函数的内容读取逻辑:

@self.flaskServer.route('/')
def ClickEventButton():
    # strip()去掉末尾多余的换行符
    newText = self.textToTemplate.get(1.0, END).strip()
    return newText

内容的提问来源于stack exchange,提问作者Shervin.bdn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:36:04