Как уничтожить или удалить холст tkinter, упакованный в другой холст? - PullRequest
0 голосов
/ 11 июля 2019

Я хотел бы получить чистое и эффективное решение для удаления / уничтожения встроенных объектов Canvas.Когда я говорю «встроенные объекты Canvas», я имею в виду холст, который был упакован в другой холст.

Мое текущее решение - пройти и вручную удалить («все») .destroy () каждого холста по отдельности.Это решение является чрезвычайно громоздким, его трудно упорядочить, поддерживать и заставляет меня беспокоиться о том, что я не собираю мусор надлежащим образом.

Эксперимент с приведенным ниже кодом показывает, что ничего, кроме удаления самого объекта (del (var)) фактически заставит print (var) выдать ошибку.в противном случае, после того, как var.delete ("all") и var.destroy () print (var) выдаст.! canvas

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

Нет сообщений об ошибках, просто хочу узнать, не засоряется ли мой код илипамять излишне.В поисках более чистого, более простого и эффективного решения.

...