如何销毁或删除包装在另一个画布中的tkinter画布?

2024-10-03 23:30:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想一个干净和有效的解决方案来删除/销毁嵌入画布对象。当我说“嵌入的画布对象”时,我指的是一个已经被打包到另一个画布中的画布。你知道吗

“我的画布”(My canvas())和“手动销毁所有当前画布”(go to delete all current)。这个解决方案非常庞大,很难排序、维护,并且让我担心没有适当地垃圾收集所有内容。你知道吗

对下面的代码进行的实验表明,除了删除对象本身(del(var))之外,任何东西都不会导致print(var)产生错误。否则之后变量删除(“全部”)和变量销毁()打印(var)生成。!画布

from tkinter import *

# some arbitrary arrangement of canvas objects

root = Tk()
root.geometry("1600x900")

# highest level
topLevel = Canvas(root, bg="blue")
topLevel.pack(fill=BOTH, expand=1)

# second level
redTop = Canvas(topLevel, bg="red")
redTop.pack(side=TOP, fill=X)

greenBottom = Canvas(topLevel, bg="green")
greenBottom.pack(side=BOTTOM, fill=X)

# third level
blackBox = Canvas(redTop, bg="black")
blackBox.pack(side=LEFT)

whiteBox = Canvas(greenBottom, bg="white")
whiteBox.pack(side=RIGHT)

mainloop()

# possible cleanup methods
def my_current_solution():
    # starting with the leaf nodes and traversing back in order
    blackBox.delete("all")
    blackBox.destroy()
    del blackBox

    redTop.delete("all")
    redTop.destroy()
    del redTop

    whiteBox.delete("all")
    whiteBox.destroy()
    del whiteBox

    greenBottom.delete("all")
    greenBottom.destroy()
    del greenBottom

    topLevel.delete("all")
    topLevel.destroy()
    del topLevel


def same_but_automated(list):
    # assume list is made up of canvases inserted in proper order
    for canvas in list:
        canvas.delete("all")
        canvas.destroy()
        del canvas


def what_I_hope_is_okay():
    # eliminating only the root *hopefully* does not cause a serious memory leak?
    topLevel.delete("all")
    topLevel.destroy()
    del topLevel

没有错误信息,只是想知道我是否不必要地阻塞了代码或内存。寻找更清洁、更简单、更高效的解决方案。你知道吗


Tags: 画布rootalldeletepackcanvasbgdel