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
相关产品推荐
相关产品推荐

