Отображать изображения в холсте tkinter - PullRequest
0 голосов
/ 02 февраля 2019

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

Мой кодЭто

from tkinter import *
from random import *

canvas_width = 800
canvas_height = 800

master = Tk()
canvas = Canvas(master, width=canvas_width, height=canvas_height, bg="black")
canvas.pack()

def images():
    for _ in range(3):
        Image_creator().create_image()

class Image_creator:

    def create_image(self):

        start_x = randint(1, canvas_width//2)
        start_y = randint(1, canvas_height//2)

        img = PhotoImage(file="pac_inizio.png")
        master.img = img
        self.image = canvas.create_image(start_x, start_y, anchor=NW, image=img)

images()

mainloop()

На самом деле с этим кодом отображается только 1 из 3 изображений, я думаю, что другие 2 изображения холста созданы, но без изображения внутри.Я попытался изменить функцию create_image для кнопок создания вместо изображений холста и понять, действительно ли это было так, как я думал.Если вы запускаете код с измененной функцией, он отображает 3 кнопки, но только одну с изображением внутри.

def create_image(self):

    start_x = randint(1, canvas_width//2)
    start_y = randint(1, canvas_height//2)

    img = PhotoImage(file="pac_inizio.png")
    master.img = img
    self.image = Button( anchor=NW, image=img)
    self.image.place(x=start_x, y=start_y)

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

1 Ответ

0 голосов
/ 02 февраля 2019

Вы, похоже, знаете об общей проблеме изображений в tkinter, когда они собираются мусором, хотя они все еще где-то используются, если только нет явной ссылки на эти изображения.Однако обратите внимание, что с master.img = img у вас всегда будет ссылка только на одно из трех (идентичных) изображений.Если эти изображения должны отличаться в вашем фактическом коде, создайте master.img список (или используйте любой другой список в общем счете для хранения изображений).

Однако, поскольку изображения одинаковы,Вы также можете просто загрузить изображение один раз непосредственно в глобальную область, а не в метод, а затем использовать это изображение.Кроме того, нет особого смысла в том, чтобы иметь этот класс только для этого одного метода (более того, поскольку экземпляр также является мусором, собираемым в цикле).

img = PhotoImage(file="pac_inizio.gif") # create once in global score
def create_image():                     # regular function, not method
    start_x = randint(1, canvas_width//2)
    start_y = randint(1, canvas_height//2)
    canvas.create_image(start_x, start_y, anchor=NW, image=img)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...