热汤里头的咸鱼 2023-10-26 12:14 采纳率: 33.3%
浏览 24
已结题

tk组件失效改如何解决?_tkinter.TclError

想要两个py文件之间互相切换,但是dateentry组件会出现错误_tkinter.TclError: bad window path name ".!dateentry.!entry",无法正常点击,而且出现多个窗口,单个py文件运行的话它是能够正常显示的运行的,一调用就不行,试过用toplevel,但是用了就销毁不了组件,程序退出后取消不了进程

img


下面这个是代码
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.grid(row=0, column=0)
        self.btn_back = ttk.Button(self.win,text="回上一页",command=self.back())
        self.btn_back.grid(row=1,column=0)
        self.win.mainloop()
    def back(self):
        import test1
        test1.Test1()
        self.win.destroy()

test1.py

import ttkbootstrap as ttk


class Test1:
    def __init__(self):
        self.win1 = ttk.Window(themename="minty")
        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()
        self.win1.destroy()


Test1()

  • 写回答

2条回答 默认 最新

  • 玥轩_521 2023-10-26 12:20
    关注

    看起来你正在尝试在不同的Python脚本中打开Tkinter窗口,并在这些窗口之间切换。这可能会导致一些问题,因为Tkinter窗口是全局的,这意味着每个脚本都会修改和控制同一个窗口。
    为了解决这个问题,你可以使用Toplevel窗口,这是一种新的、独立于主窗口的窗口。这样,你就可以在不同的脚本之间创建和管理不同的窗口,而不会相互干扰。
    例如,你可以将你的代码修改如下:

    import tkinter as tk
    from tkinter import ttk
    
    class Test:
        def __init__(self, master=None):
            self.master = master or tk.Tk()
            self.master.geometry("300x300")
            self.test = ttk.DateEntry(self.master, bootstyle="success")
            self.test.grid(row=0, column=0)
            self.btn_back = ttk.Button(self.master,text="回上一页",command=self.back)
            self.btn_back.grid(row=1,column=0)
            self.master.mainloop()
    
        def back(self):
            from tkinter import Toplevel
            win = Toplevel(self.master)
            win.geometry("600x600")
            btn = ttk.Button(win, text="click", command=self.test)
            btn.grid(row=0, column=0)
    
            def close_win():
                win.destroy()
    
            win.protocol("WM_DELETE_WINDOW", close_win)
    
    win = Test()
    

    在这个例子中,我们创建了一个新的Toplevel窗口,而不是使用原来的master窗口。这样,我们就可以在不破坏原来窗口的情况下,创建一个新的窗口,并在其中添加一个按钮。
    当用户点击这个按钮时,我们会调用Test类中的test方法,这个方法会创建一个新的Toplevel窗口,并在其中添加另一个日期输入框。然后,我们还会添加一个关闭按钮,以便用户可以方便地关闭这个新窗口。
    请注意,我们在close_win函数中添加了窗口协议,以便在用户关闭窗口时执行特定的操作(在这种情况下,就是销毁窗口)。这是为了防止窗口在没有正确处理关闭事件时消失或闪烁。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 创建了问题 10月26日

悬赏问题

  • ¥15 防火墙的混合模式配置
  • ¥15 Ubuntu不小心注销了要怎么恢复啊
  • ¥15 win10电脑安装完plcsim advanced4.0运行时为什么会提示找不到虚拟网卡
  • ¥15 安装powerbuilder10卡在安装程序正在运行这个页面 没有下一步任何指令
  • ¥15 关于mpi的问题:请问遇到这种情况需要怎么解决,出现这个问题后电脑不能进行mpi多核运行只能进行单核运行
  • ¥50 微信聊天记录备份到电脑提示成功了,但还是没同步到电脑微信
  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link