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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:50:11