首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter错误:动态删除帧时窗口路径名不正确

Tkinter错误:动态删除帧时窗口路径名不正确
EN

Stack Overflow用户
提问于 2019-11-14 20:36:36
回答 1查看 84关注 0票数 0

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

代码语言:javascript
复制
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.TclError:错误的窗口路径名".!frame2“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 21:32:47

您的代码需要从列表中移除框架。取而代之的是调用pop,它总是删除最后一项。这会导致您丢失对最后一个窗口的引用,并且frames中的一个引用现在指向一个已被删除的窗口(这是错误的根本原因)

相反,调用remove

代码语言:javascript
复制
def delete_frame(self):
    self.l.destroy()
    frames.remove(self)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58856949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档