首页 > 解决方案 > 制作透明菜单按钮图像

问题描述

所以,我在制作带有透明图像的菜单按钮时遇到了一些问题。我以前使用透明图像作为按钮,删除背景没有问题。但是,在创建菜单按钮时,我似乎无法使图像透明。

使用此代码,我可以使用具有透明背景(例如圆形)的图像制作普通按钮,并且可以删除默认的彩色按钮背景:

button = tk.Button(self, compound = tk.TOP, borderwidth = 0, image = photo, text="some text", command = lambda: somemethod())

我尝试使用以下代码在菜单按钮上复制它:

style = ttk.Style()
style.configure("test.TButton", borderwidth = 0)

self.mb = ttk.Menubutton(self, text = "Menu", style = "test.TButton", image = photo)

但我无法摆脱默认按钮背景,谁能帮我实现这一点?

如果不清楚,我的目标是让菜单按钮使用没有背景的图像而不是文本,如果有更好的方法可以做到这一点,如果有人能让我知道,我将不胜感激。

需要明确的是,我的问题特别是 ttk Menubuttons,而不是常规的 tk 按钮。

另外,如果它很重要,我正在使用 Pillow 进行图像处理和使用 PNG 文件。

这是该问题的最小代码:

""" os imports """
import os

""" tkinter imports """
import tkinter as tk
from tkinter import ttk

""" pillow imports """
from PIL import Image, ImageTk

class MainView(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        home_path = os.path.normpath("Java.png")
        self.home_icon = ImageTk.PhotoImage(Image.open(home_path))

        style = ttk.Style()
        style.configure("test.TButton", borderwidth = 0, compound = tk.TOP)

        self.mb = ttk.Menubutton(parent, text = "Menu", style = "test.TButton", image = self.home_icon)
        self.mb.grid(row = 0, column = 0, sticky = tk.N + tk.W)

        button = tk.Button(parent, compound = tk.TOP, borderwidth = 0, image = self.home_icon, text="test", command = lambda: test()).grid(row = 1, column = 0, sticky = tk.N + tk.W)

    def test(self):
        pass

if __name__ == "__main__":
    root = tk.Tk()

    """ change aspect ratio of the program """
    sizex = 1280
    sizey = 720
    posx  = 0
    posy  = 0
    root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

    main = MainView(root)
    root.mainloop()

图片链接: https ://imgur.com/a/ca3wZ66

标签: pythontkinter

解决方案


我不确定您要尝试做什么,但是此文档说:

Menubutton部件是始终可见的下拉菜单的一部分。它总是Menu控制用户点击Menubutton.

(强调我的)

ttk.Menubutton因此,据我所知,以下内容似乎能够创建一个具有透明背景的内容。

import os

""" tkinter imports """
import tkinter as tk
from tkinter import ttk

""" pillow imports """
from PIL import Image, ImageTk

class MainView(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        home_path = os.path.normpath("Java.png")
        self.home_icon = ImageTk.PhotoImage(Image.open(home_path))

        style = ttk.Style()
        style.configure("test.TButton", borderwidth=0, compound=tk.TOP)

        self.mb = ttk.Menubutton(parent, text="Menu", style="test.TButton",
                                 image=self.home_icon)
        self.mb.grid(row=0, column=0, sticky=tk.N + tk.W)

        self.menu = tk.Menu(self.mb, tearoff=False)
        self.menu.add_command(label='Test', command=lambda: self.test)

        self.mb['menu'] = self.menu

#        button = tk.Button(parent, compound=tk.TOP, borderwidth=0, image=self.home_icon,
#                           text="test", command=lambda: self.test)
#        button.grid(row=1, column=0, sticky=tk.N + tk.W)

    def test(self):
        pass

if __name__ == "__main__":
    root = tk.Tk()

    """ change aspect ratio of the program """
    sizex = 800
    sizey = 600
    posx  = 50
    posy  = 50
    root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

    main = MainView(root)
    root.mainloop()

结果显示:

显示菜单按钮的屏幕截图


推荐阅读