Python 3.x Tkinter错误:动态删除帧时窗口路径名称错误

Python 3.x Tkinter错误:动态删除帧时窗口路径名称错误,python-3.x,user-interface,tkinter,tk,Python 3.x,User Interface,Tkinter,Tk,我想在特金特重现一个小版本的特雷罗。现在我卡住了,我有一个问题,当我想删除帧在不同的顺序。例如:我点击按钮,如果我删除了所有内容,就会生成一个新的框架。如果我创建了3个帧,我必须按照创建它们的相同顺序删除它们。所以我认为我的问题在于pop功能,但我不知道如何手动访问它们。当我将pop函数更改为(1)时,我必须首先删除第二个创建,而不是第一个。 代码如下: from tkinter import * class Window: def __init__(self, width, heig

我想在特金特重现一个小版本的特雷罗。现在我卡住了,我有一个问题,当我想删除帧在不同的顺序。例如:我点击按钮,如果我删除了所有内容,就会生成一个新的框架。如果我创建了3个帧,我必须按照创建它们的相同顺序删除它们。所以我认为我的问题在于pop功能,但我不知道如何手动访问它们。当我将pop函数更改为(1)时,我必须首先删除第二个创建,而不是第一个。 代码如下:

from tkinter import *

class Window:
    def __init__(self, width, height):
        self.root = Tk()
        self.width = width
        self.height = height
        self.root.geometry(width + "x" + height)

class Frames:
    def __init__(self):
        self.l = Frame(window.root, bg="red", height=300, width=300, relief="sunken")
        self.l.place(relwidth=0.3, relheight=0.3)
        self.deleteB = Button(self.l, text="X", command=self.delete_frame, bg="blue")
        self.deleteB.place(rely=0, relx=0.92)
        self.addB = Button(self.l, text="Add", command=self.add_note, bg="blue")
        self.addB.place(rely=0, relx=0.65)

    def delete_frame(self):
        self.l.pack()
        self.l.pack_forget()
        self.l.destroy()
        frames.pop()

    def add_note(self):
        self.note_Label = Label(self.l, text="Clean the room")
        self.note_Label.pack(padx=20, pady=10)
        self.delete_Note = Button(self.note_Label, text="X", command=self.del_Note)
        self.delete_Note.pack(padx=5, pady=5)

    def del_Note(self):
        self.note_Label.pack_forget()
        self.note_Label.destroy()

class Note:
    def __init__(self):
        pass

class DragNDrop:
    def __init__(self):
        pass
    def make_draggable(self, widget):
        widget.bind("<Button-1>", self.on_drag_start)
        widget.bind("<B1-Motion>", self.on_drag_motion)

    def on_drag_start(self, event):
        widget = event.widget
        widget._drag_start_x = event.x
        widget._drag_start_y = event.y

    def on_drag_motion(self, event):
        widget = event.widget
        x = widget.winfo_x() - widget._drag_start_x + event.x
        y = widget.winfo_y() - widget._drag_start_y + event.y
        widget.place(x=x, y=y)


class Buttons:
    def __init__(self):
        self.button = Button(window.root, width=20, height=20, bg="blue", command=self.add_frames)
        self.button.pack()

    def add_frames(self):
        frames.append(Frames())
        print(frames)


window = Window("800", "600")
frames = []

drag = DragNDrop()

button = Buttons()

while True:
    for i in frames:
        drag.make_draggable(i.l)
    window.root.update()
从tkinter导入*
类窗口:
定义初始值(自身、宽度、高度):
self.root=Tk()
self.width=宽度
自我高度=高度
自根几何图形(宽度+x+高度)
类框架:
定义初始化(自):
self.l=Frame(window.root,bg=“red”,高度=300,宽度=300,浮雕=“凹陷”)
自升位置(相对宽度=0.3,相对高度=0.3)
self.deleteB=按钮(self.l,text=“X”,command=self.delete\u frame,bg=“blue”)
self.deleteB.place(rely=0,relx=0.92)
self.addB=按钮(self.l,text=“Add”,command=self.Add\u注意,bg=“blue”)
self.addB.place(rely=0,relx=0.65)
def delete_帧(自身):
self.l.pack()
self.l.pack_忘记()
自我毁灭
frames.pop()
def添加注释(自我):
self.note\u Label=标签(self.l,text=“打扫房间”)
自注标签包(padx=20,pady=10)
self.delete\u Note=按钮(self.Note\u标签,text=“X”,command=self.del\u Note)
self.delete_Note.pack(padx=5,pady=5)
def del_注释(自身):
self.note\u Label.pack\u遗忘()
self.note_Label.destroy()
课堂笔记:
定义初始化(自):
通过
类DragNDrop:
定义初始化(自):
通过
def使_可拖动(自身、小部件):
widget.bind(“,self.on\u drag\u start)
widget.bind(“,self.on\u drag\u motion)
def on_拖动_启动(自身、事件):
widget=event.widget
widget.\u拖动\u开始\u x=event.x
widget.\u拖动\u开始\u y=event.y
拖动运动时的def(自身、事件):
widget=event.widget
x=widget.winfo\u x()-widget.\u拖动\u开始\u x+事件.x
y=widget.winfo\u y()-widget.\u拖动\u开始\u y+事件.y
widget.place(x=x,y=y)
类别按钮:
定义初始化(自):
self.button=button(window.root,width=20,height=20,bg=“blue”,command=self.add\u框架)
self.button.pack()
def添加_帧(自):
frames.append(frames())
打印(帧)
窗口=窗口(“800”、“600”)
帧=[]
drag=DragNDrop()
按钮=按钮()
尽管如此:
对于帧中的i:
拖动。使可拖动(i.l)
window.root.update()
如果有人有一个想法或解决办法,最好知道。 我还有另一个想法,不是销毁它们,我可以把它们隐藏起来,但最终会让程序在某个点上变得非常慢


错误如下:\u tkinter.TclError:窗口路径名错误“!frame2”

您的代码需要从列表中删除该帧。相反,您调用的是
pop
,它总是删除最后一项。这会导致丢失对上一个窗口的引用,
frames
中的一个引用现在指向已删除的窗口(这是错误的根本原因)

相反,请调用
remove

def delete_frame(self):
    self.l.destroy()
    frames.remove(self)

在此处发布您遇到的错误:\ u tkinter.TclError:错误的窗口路径名“!frame2”