Tkinter create_image () сохраняет прозрачность PNG, а Button (изображение) - нет - PullRequest
1 голос
/ 22 апреля 2019

TkVersion = 8.6, Python версия 3.7.3

Я пытаюсь создать кнопку в python с помощью tkinter, используя изображение PNG. Прозрачные углы изображения прозрачны в зависимости от того, какой виджет я использую. Кажется, canvas.create_image - единственный виджет, сохраняющий прозрачность.

Сначала я добавил изображение на холст, используя create_image(0,0, image=button), и оно отлично работает - закругленные углы прозрачны.

Но затем, когда я пытаюсь реализовать ее как фактическую кнопку с использованием виджетов Button() и create_window(), углы заполняются белым.

button = ImageTk.PhotoImage(file="button.png")

canvas = tk.Canvas(width=200, heigh=200, borderwidth=0, highlightthickness=0)
canvas.grid()
canvas.create_rectangle(0,0,199,199, fill="blue")

canvas.create_image(0,0, image=button, anchor="nw")

works []

button = ImageTk.PhotoImage(file="button.png")

canvas = tk.Canvas(width=200, heigh=200, borderwidth=0, highlightthickness=0)
canvas.grid()
canvas.create_rectangle(0,0,199,199, fill="blue")

buttonWidget = tk.Button(root, image=button)
canvas.create_window(0,0, window=buttonWidget, anchor="nw")

doesnt work

Как сделать углы кнопок PNG прозрачными?

Вот также изображение кнопки: button

1 Ответ

1 голос
/ 22 апреля 2019

Вы можете сделать свой собственный класс кнопок унаследованным от canvas и использовать его так же, как вы используете Button(). Я сделал один для вас, надеюсь, вы найдете это полезным.

Класс пользовательских кнопок:

Сохраните этот класс в отдельном файле как imgbutton.py, а затем импортируйте его в основной файл. Также убедитесь, что он находится в том же каталоге, в котором находится основной файл. Или вы можете просто сохранить его в верхней части основного файла после импорта.

import tkinter as tk

class Imgbutton(tk.Canvas):

    def __init__(self, master=None, image=None, command=None, **kw):

        # Declared style to keep a reference to the original relief
        style = kw.get("relief", "groove")        

        if not kw.get('width') and image:
            kw['width'] = image.width()
        else: kw['width'] = 50

        if not kw.get('height') and image:
            kw['height'] = image.height()
        else: kw['height'] = 24

        kw['relief'] = style
        kw['borderwidth'] = kw.get('borderwidth', 2)
        kw['highlightthickness'] = kw.get('highlightthickness',0)

        super(Imgbutton, self).__init__(master=master, **kw)

        self.set_img = self.create_image(kw['borderwidth'], kw['borderwidth'], 
                anchor='nw', image=image)

        self.bind_class( self, '<Button-1>', 
                    lambda _: self.config(relief='sunken'), add="+")

        # Used the relief reference (style) to change back to original relief.
        self.bind_class( self, '<ButtonRelease-1>', 
                    lambda _: self.config(relief=style), add='+')

        self.bind_class( self, '<Button-1>', 
                    lambda _: command() if command else None, add="+")

Вот пример того, как его использовать

import tkinter as tk
from imgbutton import Imgbutton    # Import the custom button class

root = tk.Tk()
root['bg'] = 'blue'

but_img = tk.PhotoImage(file='button.png')

but = Imgbutton(root, image=but_img, bg='blue', 
            command=lambda: print("Button Image"))
but.pack(pady=10)

root.mainloop()
...