当前位置: 首页 > 面试题库 >

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

程钧
2023-03-14
问题内容

我想个性化菜单栏。例如,我想删除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>事件“绑定”到标签,以便在标签下创建某种下拉菜单。可能吗?


问题答案:

问题 :自定义菜单栏是否不使用小部件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



 类似资料:
  • 到目前为止,我发现有一些关于设备控件的有用指南,这是一个非常适合domotics和自动化的特性。例如,关于设备控制的官方文章显示了一个完整的Power菜单,带有信用卡刷卡和domotics控制。 我对开发一个自定义开源小部件来浏览fildelity(条形码)卡片很感兴趣。我已经看到快速访问钱包功能是一个用来显示支付方式的刷卡,但我有充分的理由不走这条路。首先,它是为持有NFC权限的支付应用程序设计

  • 问题内容: 我需要一个可以在其中放置小部件的列。我有这个: 但是我不知道如何在HTML中包含小部件 PS或不是Widget,只有GWT Button才适合我。 问题答案: 参见此处,了解有关AbstractCell实现的许多示例。 要回答有关GWT按钮的问题: 试图在单元格元素内渲染整个小部件在很大程度上是不可行的(并且不建议这样做),但这听起来好像您确实是在尝试从单元格内渲染按钮。 Abstra

  • 1. 小程序更多菜单功能说明 为了支持 App 内的不同业务需求、支持不同类型的分享,当前 SDK 支持配置更多菜单,按类型可分为 onMiniProgram 和 common 类型(均在管理后台配置) common: 该类型无需小程序添加额外处理 onMiniProgram: 该类型菜单在点击时,会向小程序获取数据用以提供给 App 的业务处理 如果菜单的按钮类型是 onMiniProgram

  • 自定义菜单是指为单个应用设置自定义菜单功能,所以在使用时请注意调用正确的应用实例。 $config = [ 'corp_id' => 'xxxxxxxxxxxxxxxxx', 'secret' => 'xxxxxxxxxx', // 应用的 secret //... ]; $app = Factory::work($config); 创建菜单 $menus = [

  • 介绍 (Introduction) UiBinder是一个旨在分离功能和用户界面视图的框架。 UiBinder框架允许开发人员将gwt应用程序构建为HTML页面,并在其中配置GWT小部件。 UiBinder框架使与UI设计人员的协作变得更容易,他们比XML源代码更熟悉XML,HTML和CSS UIBinder提供了一种定义用户界面的声明方式。 UIBinder从UI中分离出程序逻辑。 UIBind

  • GWT提供了三种创建自定义用户界面元素的方法。 有三种一般策略可供遵循 - Create a widget by extending Composite Class - 这是创建自定义小部件的最常用和最简单的方法。 在这里,您可以使用现有小部件来创建具有自定义属性的复合视图。 Create a widget using GWT DOM API in JAVA - 以这种方式创建GWT基本窗口小部件