Diğer kod neden çalışmıyor? (canvas.create_image)

İyi akşamlar. Saatlerdir bu yaşadığım olaya kafa patlatıyorum ama bir türlü bu hayli basit görünen kod parçasını çözemedim. Yapmak istediğim Tkinter’da bir canvas oluşturup içerisine görsel yerleştirmek. Elimde biri normal diğer sınıf yapına uygun şekilde hazırlanmış iki kod var. Class yapısına göre uygulanmış kodda ne hikmetse canvas oluşuyor ama görsel içine aktarılmıyor. Çok farklı yollar denedim ama bir türlü olmadı. İki kodda tamamen aynı sadece biri sınıf yapısına uygun şekilde yazılmış.

image.gif

image

test.py (class)

from tkinter import *

class Test(Tk):
    def __init__(self):
        super().__init__()
        w, h = (200, 200)
        self.geometry(f"{w}x{h}")

        self.c = Canvas(width=w, height=h, bd=0, highlightthickness=0)
        self.c.pack()

        _img = PhotoImage(file="image.gif")
        img = self.c.create_image(100, 100, image=_img)

root = Test()
root.mainloop()

test.py (normal)

from tkinter import *

w, h = (200, 200)

game = Tk()
game.geometry(f"{w}x{h}")

c = Canvas(width=w, height=h, bd=0, highlightthickness=0)
c.pack()

_img = PhotoImage(file="image.gif")
img = c.create_image(100, 100, image=_img)

game.mainloop()

Şu koddan sonra:
_img = PhotoImage(file="image.gif")
Şunu ekleyin:

self.img = _img
1 Beğeni

@dildeolupbiten hocam çok teşekkür ederim. Bu yöntemin farkındaydım ama kullanmak hiç aklıma gelmedi internetde ki örneklerde de pek rastlamadım :confused:

Tkinter’de, global alanda yaratılmayan resim nesneleri daha sonradan oluşturuldukları zaman görüntülenmiyor. Bu yüzden global alanda yaratılmayan resimleri ya global hale getirmek gerekiyor ya da bir tkinter widgetine referans olarak eklemek lazım.

Şu da çözerdi:

globals()["_img"] = PhotoImage(file="image.gif")

Daha sonradan da şöyle yazardınız:

img = c.create_image(100, 100, image=_img)
1 Beğeni

Garbage collector’a gidiyor demek daha doğru. Biraz ilginç aslında, kütüphanenin refcount’u arttırmamasının bir sebebi var mı acaba…

1 Beğeni

Bilmiyorum. Aşağıdaki kaynakta da çok bir şey yazmıyor.
Kaynak: http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm

The problem is that the Tkinter/Tk interface doesn’t handle references to Image objects properly …

1 Beğeni