Создание прозрачного изображения кнопки меню - PullRequest
0 голосов
/ 06 апреля 2019

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

Используя этот код, я могу создать обычную кнопку, используя изображение с прозрачным фоном (например, круг), и могу удалить фон цветной кнопки по умолчанию:

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.

Кроме того, на случай, если это вообще имеет значение, я использую подушку для обработки изображений и файлы 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

1 Ответ

0 голосов
/ 07 апреля 2019

Я не уверен, что вы пытаетесь сделать, но эта документация говорит:

A 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()

Отображаемый результат:

screenshot showing menubutton

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...