Tkinter类内部调用filedialog点击按钮程序冻结无响应如何解决?
问题原因及解决方案
问题根因
冻结问题和Frame封装为类没有关系,核心是pyglet库与Tkinter的运行环境冲突:
代码中使用pyglet.font.add_file()加载字体的操作会初始化pyglet的底层图形/事件上下文,和Tkinter的主循环产生资源抢占。当你调用filedialog.askdirectory()弹出模态对话框时,两个框架的事件循环互相阻塞,最终导致应用无响应。你测试非封装类版本时正常,大概率是该版本中你没有引入pyglet相关的调用。
解决方法
方案1:移除pyglet依赖,使用Tkinter原生方式加载字体(最推荐)
Tkinter本身支持自定义字体调用,不需要依赖pyglet:
- 先删除代码中
pyglet.font.add_file('ARCENA.ttf')这行代码 - 把你要使用的
AR CENA字体安装到当前操作系统,Tkinter会自动识别已安装的字体,原代码中字体名称的配置不需要修改。
如果不想全局安装字体,也可以用Tkinter的font模块直接加载字体文件:
import tkinter.font as tkfont # 在BrowseFolders类的__init__中替换pyglet的加载逻辑 custom_font = tkfont.Font(family="AR CENA", file="ARCENA.ttf", size=70)
方案2:补充filedialog的parent参数(适用于必须保留pyglet的场景)
如果你的项目必须使用pyglet,可以给askdirectory方法加上父窗口参数,避免对话框上下文异常:
def select_folder(self): self.path = filedialog.askdirectory( parent=self.winfo_toplevel(), initialdir='/', title="Select Folder" )
完成修改后即可正常点击按钮弹出目录选择器,不会再出现冻结问题。
内容的提问来源于stack exchange,提问作者Rotemika
相关产品推荐
相关产品推荐

