在Tkinter画布中显示图像

时间:2019-02-02 14:40:40

标签: python canvas tkinter

尝试创建画布图像时遇到一些问题,一个类处理图像的创建,我希望该类创建的图像数量与调用它的次数相同。

我的代码是这个

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()

实际上,使用此代码仅显示3张图像中的1张,我认为创建了另外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 :(得分:0)

您似乎已经意识到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)