调用ttkbootstrap DateEntry控件触发_tkinter.TclError错误求助
问题:DateEntry控件点击触发TclError且控件消失
在test1.py中调用test.py的Test类后,DateEntry控件会消失,点击时触发_tkinter.TclError: bad window path name ".!dateentry.!entry"错误。已尝试修改样式主题、更新窗口、确保窗口名称不含下划线等操作,问题仍未解决。原代码中ttkbootstrap多选按钮、下拉组件均能正常工作,替换为tkcalendar.DateEntry后问题依旧。
报错栈
Exception in Tkinter callback Traceback (most recent call last): File "G:\python\lib\tkinter\__init__.py", line 1883, in __call__ return self.func(*args) File "G:\python\lib\site-packages\ttkbootstrap\widgets.py", line 242, in _on_date_ask new_date = Querybox.get_date( File "G:\python\lib\site-packages\ttkbootstrap\dialogs\dialogs.py", line 1671, in get_date chooser = DatePickerDialog( File "G:\python\lib\site-packages\ttkbootstrap\dialogs\dialogs.py", line 601, in __init__ self.root = ttk.Toplevel( File "G:\python\lib\site-packages\ttkbootstrap\window.py", line 454, in __init__ self.transient(transient) File "G:\python\lib\tkinter\__init__.py", line 2224, in wm_transient return self.tk.call('wm', 'transient', self._w, master) _tkinter.TclError: bad window path name ".!dateentry.!entry"
测试代码
test1.py
import ttkbootstrap as ttk class Test1: def __init__(self): self.win1 = ttk.Window() self.win1.geometry("600x600") self.btn = ttk.Button(self.win1, text="click", command=self.test) self.btn.grid(row=0, column=0) self.win1.mainloop() def test(self): import test test.Test() Test1()
test.py
import ttkbootstrap as ttk class Test: def __init__(self): self.win = ttk.Window() self.win.geometry("300x300") self.test = ttk.DateEntry(self.win,bootstyle="success") self.test.update() self.test.grid(row=0, column=0) self.win.mainloop()
解决方案
问题根源在于嵌套调用mainloop()以及重复创建ttk.Window实例。Tkinter应用应仅保留一个主循环,多个Window实例会导致Tcl上下文混乱,控件路径失效。
修复后代码
test1.py
import ttkbootstrap as ttk from test import Test class Test1: def __init__(self): self.win1 = ttk.Window() self.win1.geometry("600x600") self.btn = ttk.Button(self.win1, text="click", command=self.test) self.btn.grid(row=0, column=0) self.win1.mainloop() def test(self): Test(self.win1) Test1()
test.py
import ttkbootstrap as ttk class Test: def __init__(self, parent): self.win = ttk.Toplevel(parent) self.win.geometry("300x300") self.test = ttk.DateEntry(self.win, bootstyle="success") self.test.grid(row=0, column=0)
修复说明
ttk.Window本质是创建新的Tk实例,多个Tk实例会引发Tcl解释器上下文冲突,导致控件路径解析失败- 使用
Toplevel作为主窗口的子窗口,共享同一Tcl上下文,避免路径错误 - 仅保留一个
mainloop(),由主程序统一管理事件循环,确保控件交互正常
内容的提问来源于stack exchange,提问作者yan
相关产品推荐
相关产品推荐

