簡體   English   中英

在Tkinter畫布中顯示圖像

[英]Display images in tkinter canvas

我在嘗試創建畫布圖像時遇到一些問題,一個類處理圖像的創建,並且我希望該類創建的圖像數量與調用的次數一樣多。

我的代碼是這樣

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)

我認為問題出在圖像參考中,但不知道如何解決

您似乎已經意識到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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM