无需使用小部件tk的自定义菜单栏

发布于 2021-01-29 15:04:59

我想个性化菜单栏。例如,我想删除tk.Menu小部件周围出现的边框(使用add_command()方法)我要删除的图片

那是我的代码(我正在使用Windows 10)

import tkinter as tk 
from tkinter import ttk

dark_grey = "#212121"
dark_blue="#102A43"
blue_1="#243B53"

root = tk.Tk()
root.state('zoomed')

container = tk.Frame(root, bg = dark_grey)
container.grid_rowconfigure(0, weight = 0)
container.grid_columnconfigure(0, weight = 1)

menu_frame = tk.Frame(container, bg = dark_blue)


menu1 = tk.Menubutton(menu_frame, text = "Menu1", bg = dark_blue, fg = 
                       "white", activebackground = blue_1, activeforeground = 
                       "white")
menu1.grid(row = 0, column = 0)

submenu1 = tk.Menu(menu1, tearoff = 0, bg = dark_blue, 
activebackground= blue_1, fg = "white",borderwidth = 0, activeborderwidth= 0)

submenu1.add_command(label = "Option 1.1")
submenu1.add_command(label = "Option 1.2")

menu1.configure(menu = submenu1)


menu_frame.grid(row = 0, column = 0, sticky = "ew")
container.pack(fill = tk.BOTH, expand = "True")
root.mainloop()

我的想法是在不使用tk.Menu和tk.MenuButton的情况下创建菜单。我想将<Enter>事件“绑定”到标签,以便在标签下创建某种下拉菜单。可能吗?

关注者
0
被浏览
117
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题 :自定义菜单栏是否不使用小部件tk.Menu

    本示例使用atk.Toplevel作为弹出窗口,并显示添加的tk.Menubutton
    菜单 遵循定义的“ 顶部 样式 tk.Menubutton


    待办事项

    • 如果在外部或其他 顶部 单击,请关闭弹出窗口Menubutton
    • 除其他以外扩展 tk.Menubutton
    • 键盘支持


    import tkinter as tk
    
    
    class Menu:
        def __init__(self, parent, **kwargs):
            self._popup = None
            self._menubutton = []
            self.parent = parent
    
            self.parent.bind('<Button-1>', self.on_popup)
    
        def on_popup(self, event):
            w = event.widget
            x, y, height = self.parent.winfo_rootx(), self.parent.winfo_rooty(), self.parent.winfo_height()
    
            self._popup = tk.Toplevel(self.parent.master, bg=self.parent.cget('bg'))
            self._popup.overrideredirect(True)
            self._popup.geometry('+{}+{}'.format(x, y + height))
    
            for kwargs in self._menubutton:
                self._add_command(**kwargs)
    
        def add_command(self, **kwargs):
            self._menubutton.append(kwargs)
    
        def _add_command(self, **kwargs):
            command = kwargs.pop('command', None)
    
            menu = self.parent
            mb = tk.Menubutton(self._popup, text=kwargs['label'],
                               bg=menu.cget('bg'),
                               fg=menu.cget('fg'),
                               activebackground=menu.cget('activebackground'),
                               activeforeground=menu.cget('activeforeground'),
                               borderwidth=0,
                               )
            mb._command = command
            mb.bind('<Button-1>', self._on_command)
            mb.grid()
    
        def _on_command(self, event):
            w = event.widget
            print('_on_command("{}")'.format(w.cget('text')))
    
            self._popup.destroy()
    
            if w._command is not None:
                w._command()
    

    用法

    class App(tk.Tk):
        def __init__(self):
            super().__init__()
            self.geometry("200x200")
    
            style = {'bg': "#102A43", 'fg': "white", 
                     'activebackground': "#243B53", 'activeforeground': "white",
                     'borderwidth': 0}
    
            menu1 = tk.Menubutton(self, text="Menu1", **style)
            submenu1 = Menu(menu1)
            submenu1.add_command(label="Option 1.1")
            submenu1.add_command(label="Option 1.2")
            menu1.grid(row=0, column=0)
    
            menu2 = tk.Menubutton(self, text="Menu2", **style)
            submenu2 = Menu(menu2)
            submenu2.add_command(label="Option 2.1")
            submenu2.add_command(label="Option 2.2")
            menu2.grid(row=0, column=2)
    
    
    if __name__ == "__main__":
        App().mainloop()
    

    使用Python测试:3.5-‘TclVersion’:8.6’TkVersion’:8.6



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看