Tkinter arka plan renginden kurtulmak mümkünmü?

Mümkün ama bunun için biraz farklı bir yol izlemek gerekiyor çünkü tkinter widgetlerinin şeffaf arka plan özelliği yok.

Eğer arka planı şeffaf olan bir button oluşturmak istiyorsak, aslında canvas nesnelerini bu amaçla kullanabiliriz. Örneğin bir tane resim ekleyebiliriz ve eklediğimiz resme bir takım olaylar bağlayabiliriz. Bu olaylar resmin button gibi davranmasını sağlayabilir.

Aşağıda bu konuyla alakalı bir örnek görüyorsunuz.
Bu örnekte kullanılan dosyalar şunlar:
background
play

import tkinter as tk

from PIL import Image, ImageTk, ImageOps

root = tk.Tk()

# Arka plan olarak kullanılacak resmi açalım.
_background_image = Image.open("background.jpeg")
# Resmin genişlik ve yükselik değerlerini alalım.
width, height = _background_image.size
# Bir tane PhotoImage nesnesi oluşturalım.
background_image = ImageTk.PhotoImage(_background_image)

# Düğme olarak kullanılacak ikonu açalım.
_play_icon = Image.open("play.png")
# Bir tane PhotoImage nesnesi oluşturalım.
play_icon = ImageTk.PhotoImage(_play_icon)

# Canvas nesnesini oluşturuyoruz.
canvas = tk.Canvas(master=root, width=width, height=height)
canvas.pack()
# Arka planı ekrana yerleştiriyoruz.
canvas.create_image(0, 0, image=background_image, anchor="nw")


def on_button_1(img, status):
    if status == "pressed":  # Eğer resme tıklandıysa
        # Resmin modunu RGBA olarak değiştirelim.
        _img = img.convert(mode="RGBA")
        # Resmi tayflara ayıralım. İkinci -> [1] tayfı seçelim.
        # İsterseniz farklı tayflarda nasıl sonuçlar oluşuyor
        # deneyebilirsiniz.
        _img = _img.split()[1]
        # Resmin modunu greyscale olarak değiştirelim.
        _img = _img.convert(mode="L")
        # Siyah yerler siyah kalsın, beyaz yerler green olsun.
        _img = ImageOps.colorize(_img, black="black", white="green")
        # Resmin modunu tekrar RGBA olarak ayarlayalım.
        _img = _img.convert("RGBA")
        # Siyah yerleri transparan bir hale getirelim.
        _img.putdata(
            [
                (0, 0, 0, 0) if all(i[j] < 50 for j in range(3)) else i 
                for i in _img.getdata()
            ]
        )
        # Oluşturduğumuz yeni resim ile yeni bir PhotoImage 
        # nesnesi oluşturalım.
        _img = ImageTk.PhotoImage(_img)
        print("Button pressed!")
    else:  # Eğer button1 serbest bırakıldıysa
        # Resim orijinal hale geri gelsin.
        _img = ImageTk.PhotoImage(img)
    # PhotoImage garbage collector'a gitmesin diye, PhotoImage'i canvas
    # nesnesine bağlıyoruz.
    canvas._img = _img
    # button tagına sahip canvas nesnesinin image özelliğini değiştiriyoruz.
    canvas.itemconfig("button", image=canvas._img)


# Button olarak görev yapacak resim nesnemiz.
button = canvas.create_image(
    width // 2, 
    height // 2, 
    image=play_icon, 
    anchor="center",
    tag="button"
)
# Bu resme bazı olaylar ekleyelim.
# Olay 1: <ButtonPress-1>
canvas.tag_bind(
    tagOrId=button,
    sequence="<ButtonPress-1>",
    func=lambda event: on_button_1(
        img=_play_icon, 
        status="pressed"
    )
)
# Olay 2: <ButtonPress-1>
canvas.tag_bind(
    tagOrId=button,
    sequence="<ButtonRelease-1>",
    func=lambda event: on_button_1(
        img=_play_icon, 
        status="released"
    )
)

root.mainloop()

Resmin ortasında duran play simgesine tıklamadan önce resim şu şekilde görünüyor:
Ekran görüntüsü 2020-11-23 23-49-33

Resme tıkladığımızda, play simgesinin rengi aşağıdaki gibi değişiyor:
Ekran görüntüsü 2020-11-23 23-51-59

Fare’yi serbest bıraktığımızda ise resmin rengi tekrar eski haline dönüyor. Bu arada düğmeye bastığımızda ekrana button pressed yazısı yazdırılıyor.

1 Beğeni