Python 3.7 Ссылка на фрейм Tkinter постоянно растет - PullRequest
0 голосов
/ 20 октября 2018

Извинения Я довольно новичок в этом ...

Я не могу перезаписать мой кадр tkinter.Я написал это, чтобы продемонстрировать свою проблему:

from tkinter import *

bgCol = 'red'

def destroyMasterFrame():
    global master
    master.destroy()
    createMasterFrame()

def createMasterFrame():
    global master, bgCol

    if bgCol == 'green':
        bgCol = 'red'
    else:
        bgCol='green'

    master = Frame(root, bg=bgCol)
    master.bind("<Button-1>", lambda event: destroyMasterFrame())
    master.pack(side='top', fill='both', expand='yes')
    print(master)

root = Tk()
root.geometry('200x200+100+100')

createMasterFrame()

root.mainloop()

Поэтому каждый раз, когда я щелкаю по цветному квадрату, я думал, что разрушаю фрейм и начинаю все сначала, но print(master) дает мне ...

.!frame
.!frame2
.!frame3
.!frame4
.!frame5

... за каждый раз, когда я нажимаю.Я знаю, что, возможно, здесь не хватает чего-то простого, но любая помощь будет высоко ценитсяСпасибо.

Редактировать:

Если я добавлю изображение к разрушаемому фрейму, оно, похоже, сохранит его вместе со ссылкой на фрейм впамять, которая, кажется, быстро заполняет память при повторном использовании.Этот код демонстрирует, что я имею в виду ... Как мне уничтожить фрейм, его ссылку и стереть все содержимое, содержащееся в нем, из памяти? ...

from tkinter import *

def destroyMasterFrame():
    global master
    master.destroy()
    createMasterFrame()

def createMasterFrame():
    global master

    master = Frame(root, bg='green')
    master.pack(side='top', fill='both', expand='yes')

    img = PhotoImage(file='test.png')
    label = Label(master, image=img)
    label.image = img
    label.bind("<Button-1>", lambda event: test())
    label.pack(side='top', fill='both', expand='yes')

    print(master)

def test():
    global myrange
    myrange = 1000
    for x in range(myrange):
        createMasterFrame()
        destroyMasterFrame()

root = Tk()
root.geometry('200x200+100+100')

createMasterFrame()

root.mainloop()

Еще раз спасибо за вашу помощь!

1 Ответ

0 голосов
/ 20 октября 2018

Вы действительно удаляете фрейм:

def destroyMasterFrame():
    master.destroy()
    print(master)

Если вы проверите, фрейм удален.
Ссылка на этот стек еще жива.
В любом случае, только фрейм удаляется, но нессылка.
Поэтому tkinter все еще считает / даже если кадр не отстает.
Так что не беспокойтесь и продолжайте в том же духе.
Подсказка: вам не нужно дважды использовать глобальный пользователь.

РЕДАКТИРОВАТЬ: (на основе вашего комментария)

Должно работать без очистки ссылки (понятия не имею, как).
Должен быть предел 2 ^ 63 <- max int в python. </p>

Контрольный пример:

myrange = 100000
for x in range(myrange):
    createMasterFrame()
    destroyMasterFrame()
    if x == myrange-1:
        print(master)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...