Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个自定义菜单栏,不使用小部件tk.menu_Python_Tkinter_Drop Down Menu_Tkinter.style - Fatal编程技术网

Python 一个自定义菜单栏,不使用小部件tk.menu

Python 一个自定义菜单栏,不使用小部件tk.menu,python,tkinter,drop-down-menu,tkinter.style,Python,Tkinter,Drop Down Menu,Tkinter.style,我想要一个菜单栏。例如,我想删除tk.Menu小部件周围显示的边框(使用add_command()方法) 这是我的代码(我使用的是Windows 10) 我的想法是不使用tk.menu和tk.MenuButton创建菜单。我希望将事件“绑定”到标签,以便在标签下创建一种下拉列表。可能吗 问题:不使用小部件的自定义菜单栏tk.菜单 本例使用tk.Toplevel作为弹出窗口,并显示添加的tk.Menubutton 子菜单遵循顶部菜单按钮的定义样式 待办事项: 如果单击外部或其他顶部的菜单按钮,

我想要一个菜单栏。例如,我想删除tk.Menu小部件周围显示的边框(使用add_command()方法)

这是我的代码(我使用的是Windows 10)

我的想法是不使用tk.menu和tk.MenuButton创建菜单。我希望将
事件“绑定”到标签,以便在标签下创建一种下拉列表。可能吗

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

本例使用
tk.Toplevel
作为弹出窗口,并显示添加的
tk.Menubutton

子菜单遵循顶部菜单按钮的定义样式


待办事项

  • 如果单击外部或其他顶部的
    菜单按钮
    ,则关闭弹出窗口
  • 使用除tk之外的其他菜单按钮扩展。菜单按钮
  • 键盘支持


用Python测试:3.5-“Tcl版本”:8.6“TkVersion”:8.6

可能吗?肯定简单?可能不会。值得注意的是,
菜单
使用本机操作系统的外观,因此它看起来与系统上的其他菜单一致。我个人建议不要太担心它,因为实现您自己的菜单将有更多的代码,因此功能性错误有更多的机会来改善外观。“我想将事件“绑定”到标签上-是什么阻止了您这么做?我使用了带有tk.menu的菜单按钮来制作图片中显示的内容。问题是我不知道如何让窗口显示在标签下(而不是菜单按钮)@BryanOakley@tsdev2k“我想删除边框”:使用
menu.config(borderwidth=0,activeborderwidth=0)
这并不能解决问题,因为我想删除图片@stovfthank you中显示的白色边框。我将尝试完成它。@tsdev2k已读
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()
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()