Утечка в обновлении этикетки - PullRequest
2 голосов
/ 12 декабря 2011

Я новичок в tkinter и обнаружил утечку памяти в проекте, который я выполняю до часа в своем коде.Оказывается, утечка памяти происходит при обновлении метки, самый простой пример, который я нашел в коде:

import Tkinter as tk

class Display:
    def __init__(self, master):
        self.master = master
        self.tick()

    def tick(self):
        self.label = tk.Label(self.master, text = 'a')
        self.label.place(x=0,y=0)
        self.master.after(50, self.tick)

root = tk.Tk()
disp = Display(root)

Если кто-нибудь скажет мне, почему эта утечка памяти, я был бы благодарен.

Спасибо, Мэтт

Ответы [ 2 ]

4 голосов
/ 12 декабря 2011

Проблема в том, что tick продолжает создавать новые ярлыки.Нет причин создавать более одной метки в цикле, подобном этому, если только вам действительно не нужно постоянно увеличивающееся количество меток.Вы можете обновить текст виджета метки с помощью метода configure.

Например:

def tick(self):
    self.label.configure(text=`my new text`)
    self.after(50, self.tick)
0 голосов
/ 12 декабря 2011

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

Вот немного пересмотренная версия, которая не пропускает ....

import Tkinter as tk

class Display:
    def __init__(self, master):
        self.label = None
        self.master = master
        self.tick()

    def tick(self):
        if self.label:
            self.label.destroy()
        self.label = tk.Label(self.master, text = 'a')
        self.label.place(x=0,y=0)
        self.master.after(50, self.tick)

root = tk.Tk()
disp = Display(root)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...