Tkinter错误:动态删除框架时窗口路径名错误

我正在尝试在tkinter中重新创建trello的小版本。现在我卡住了,当我想以其他顺序删除帧时遇到问题。例如:单击按钮,如果删除所有内容,则会生成一个新框架。如果创建3个框架,则必须按照创建它们的相同顺序将其删除。所以我认为我的问题出在弹出功能上,但我不知道如何手动访问它们。当我将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,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.TclError:错误的窗口路径名“。!frame2”

qq41447815 回答:Tkinter错误:动态删除框架时窗口路径名错误

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

相反,请致电remove

def delete_frame(self):
    self.l.destroy()
    frames.remove(self)
本文链接:https://www.f2er.com/3102576.html

大家都在问