为了账号安全,请及时绑定邮箱和手机立即绑定

Tkinter create_image() 保留 PNG 透明度,但 Button(image)

Tkinter create_image() 保留 PNG 透明度,但 Button(image)

largeQ 2022-01-18 16:10:28
TkVersion = 8.6,Python 版本 3.7.3我正在尝试使用 PNG 图像在 python 中创建一个带有 tkinter 的按钮。图像的透明角是否透明取决于我使用的小部件。它似乎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")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")如何使 PNG 按钮角透明?这也是按钮图像:
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

你可以让自己的自定义按钮类继承自画布,并像使用Button(). 我为你做了一个,希望对你有帮助。

//img1.sycdn.imooc.com//61e676360001e34f02640284.jpg

自定义按钮类:


将此类保存在单独的文件中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()


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 387 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信