Освобождение ОЗУ в Tkinter (Python 3.6) - PullRequest
0 голосов
/ 18 июня 2020

в чем дело? Итак, в настоящее время я работаю над школьным проектом, и я использую tkinter, чтобы отображать изображения на холсте (используя pmw scrolledcanvas в случае, если это имеет значение), и после того, как я `` удаляю '' изображения, они все еще остаются память.

        def f():
            self.canv.component('canvas').delete(ALL)
            self.plslabel.configure(text=self.plsts.name.upper())
            self.plslabel.place(x=617, y=45, anchor=CENTER)
            songs = [song for song in self.plsts.songs]
            print("REFRENCE COUNT IS ",sys.getrefcount(self.canv.image))
            del self.canv.image[:]
            del self.canv.image
            gc.collect()
            self.canv.image = []

Программа тематическая c, поэтому название такое, как оно ... если я попытаюсь вывести на экран список воспроизведения (набор песен), а потом я Я показываю еще один, объем оперативной памяти увеличивается до тех пор, пока он не достигнет областей GB, что действительно не очень хорошо. Он начинается примерно с ~ 80 МБ (хорошо, учитывая, что есть другие вещи) и заканчивается так после часа его использования, отображения и удаления списков воспроизведения.

Final Ram

Итак, о чем я спрашиваю есть ли способ освободить барабан, созданный этими изображениями, или, возможно, что-то еще, что мне не хватает, я попытался использовать сборщик мусора и перейти к онлайн-решениям, но, похоже, это не сработало, поэтому, если кто-то может помочь мне, пожалуйста, помогите :)

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

import tkinter, sys, gc
import requests
from tkinter import PhotoImage
from PIL import Image,ImageTk
from io import BytesIO
from tkinter import CENTER, ALL, Label
from threading import Thread


def make_image(imageobj, x, y, myCanvas):
    photo = imageobj
    myCanvas.image.append(photo)
    myCanvas.create_image(x, y, image=photo, anchor="nw")

class Gui:
    def __init__(self, root):
        self.root = root
        self.root.resizable(True, True)
        self.canv = tkinter.Canvas(self.root)
        self.canv.image = []
        self.canv.pack()
        self.button = tkinter.Button(self.root,text="Click me to consume RAM!",command=self.run)
        self.button.pack()
        self.root.after(5,self.run)

    def run(self):
        for i in range(10):
            def f():
                self.canv.delete(ALL)
                print("REFRENCE COUNT IS ",sys.getrefcount(self.canv.image))
                del self.canv.image[:]
                del self.canv.image
                gc.collect()
                self.canv.image = []
                print("REFRENCE COUNT 2 IS ",sys.getrefcount(self.canv.image))
                img = Image.open(BytesIO(requests.get('https://image.prntscr.com/image/k0ZiVsRsQK6h2XbQtzRCUA.png').content))
                image = ImageTk.PhotoImage(img)
                make_image(image,0,0,self.canv)
            t = Thread(target=f)
            t.start()


root2 = tkinter.Tk()

Appwindow = Gui(root2)
root2.mainloop
...