Я пытаюсь отобразить несколько изображений (в png) на tkinter. Все они имеют прозрачный фон, но по какой-то причине jailer.png (наручники) отображается с черным фоном (см. Снимок экрана), в то время как все остальные изображения работают должным образом. Почему ?

Вот мой код (если create_a_label_with_an_image избыточно, это потому, что у меня было много проблем с вывозом мусора, если кто-то знает трюк, пожалуйста, скажите мне!):

import tkinter as tk
from tkinter import ttk
from os import walk
from PIL import Image, ImageTk

class Gui:
    def __init__(self):
        self.frames={"main":tk.Tk()} #every frame will be added in this dictionnary
        self.l_widgets={} #all widgets

    def create_notebook(self, name, config_args={}, grid_args={}, frame="main"):
        self.l_widgets[name] = (ttk.Notebook(self.frames[frame], **config_args),0)
        self.l_widgets[name][0].grid(**grid_args)
                 
    def create_a_label_with_an_image(self, name, filename, size=(None, None), config_args={}, grid_args={}, frame="main"):
        image_temp=Image.open(filename)
        if size!=(None,None):
            image_temp.thumbnail(size)
        image=ImageTk.PhotoImage(image_temp)
        self.l_widgets[name] = (ttk.Label(self.frames[frame]),image) #Image is stored at several places to hope it will not get erased
        self.l_widgets[name][0].config(**config_args, image=image)
        self.l_widgets[name][0].image=image
        self.l_widgets[name][0].grid(**grid_args)
            
    def add_to_notebook(self, name, name_frame, config_args={}, grid_args={}):
        self.frames[name_frame]=ttk.Frame(self.frames["main"])
        self.l_widgets[name][0].add(self.frames[name_frame], **config_args)
        self.l_widgets[name][0].grid(**grid_args)
#END ####
g=Gui()    

#here, i get all path to icons from this directory
mypath = "./Wolvesville Notebook/icons/characters"
filenames = next(walk(mypath), (None, None, []))[2]  # [] if no file
if filenames==[]:
    raise Warning("no icons found")
    
g.create_notebook("roles") 
g.add_to_notebook("roles","all", config_args={"text":"all"})
nbr_images=0
for icon in filenames:
    g.create_a_label_with_an_image(icon[:-4], mypath+"/"+icon,
                                   size=(50,50),
                                   grid_args={"row":nbr_images//12, 
                                              "column":nbr_images%12},
                                   frame=str(pool))
    nbr_images+=1
                        


tk.mainloop()

Вот как выглядит окончательный результат: Блокнот с одним онглетом с именем all и 5 значками, все прозрачные но наручники

Вот файл, который не работает: jailer.png.

Заранее благодарю за помощь!

1
Nolann Boyere 10 Окт 2021 в 13:37

2 ответа

Лучший ответ

Сначала проверьте формат файла PNG, в противном случае преобразуйте его в «RGBA».

>>> from PIL import Image
>>> im = Image.open('d:/jailer.png')
>>> im.mode
'LA'
>>> im.getpixel((0, 0))
(0, 0)
>>> new_im = im.convert(mode="RGBA")
>>> new_im.save("D:/jailer_new.png", format="PNG")

Простой код, чтобы показать разницу, слева - ваша оригинальная копия.

from tkinter import *
from PIL import Image, ImageTk

root = Tk()

im1 = Image.open("D:/jailer.png")
im2 = Image.open("D:/jailer_new.png")
pic1 = ImageTk.PhotoImage(im1)
pic2 = ImageTk.PhotoImage(im2)

label_1 = Label(root, image=pic1, bg='blue')
label_2 = Label(root, image=pic2, bg='blue')
label_1.pack(side='left')
label_2.pack(side='left')

root.mainloop()

enter image description here

1
Jason Yang 10 Окт 2021 в 11:13

AKX прокомментировал мой вопрос, чтобы преобразовать оттенки серого + альфа в rgb + alpha, и это работает! Я не знаю, почему это было в оттенках серого, но это не имеет значения. Закрою тему, спасибо!

PS: Кажется, я не могу поставить комментарий в качестве ответа, поэтому написал еще один.

0
Nolann Boyere 10 Окт 2021 в 10:53