我正试着用Tkinder创建一个菜单.此菜单由多个子菜单组成.
我用for循环构建了一个 struct 来形成这些菜单.
但是,我无法使菜单按钮根据 Select 进行更新

示例代码:

import tkinter as tk
from tkinter import ttk

class Window:
    def __init__(self, master):
        self.categories = {
            "A": {
                "B": {
                    "C": {},
                    "D": {},
                },
                "E": {
                    "F": {}
                }
            },
            "G": {}
        }

        self.menu_button = ttk.Menubutton(master, text = "Select")
        self.top_menu = tk.Menu(self.menu_button, tearoff = False)
        self.menu_button.configure(menu = self.top_menu)
        self.create_category_menu(self.categories, self.top_menu)

        self.menu_button.pack()

    # I created a recursive function, constantly checking subcategories
    def create_category_menu(self, categories, top_menu):
        for category in categories:
            if (len(categories[category]) == 0):
                # if the category has no subcategories, just add the name
                top_menu.add_cascade(label = category)
            else:
                # If there are subcategories, create a separate menu for subcategories
                # and insert it into the top menu
                menu = tk.Menu(top_menu)
                top_menu.add_cascade(label = category, menu = menu)
                self.create_category_menu(categories[category], menu)

root = tk.Tk()
window = Window(root)
root.mainloop()

代码按我想要的方式创建菜单,但我无法将所选选项写入按钮

top_menu.add_cascade(label = category, command = self.func(category))

top_menu.add_cascade(label = category, menu = menu, command = self.func(category))

我像这样更改了这两行,还在代码中创建了以下函数;

def func(self, category):
        self.menu_button["text"] = category

这一次,它将类别词典的底值("G")写入按钮.

共有97个嵌套类别.上面的代码是我为这个问题准备的示例

推荐答案

command需要callable(即:一个函数).当您执行类似command = self.func(category)的操作时,您会立即调用self.func(category)并将结果传递给command选项.

一个简单的解决方案是使用lambda,这将创建一个新函数,您可以从中调用您的函数.您可以通过使用默认参数将当前值category绑定到函数.

...
def func(self, category):
    print(f"func called with '{category}'")

def create_category_menu(self, categories, top_menu):
    for category in categories:
        if (len(categories[category]) == 0):
            top_menu.add_command(label=category, command=lambda c=category: self.func(c))
        else:
            ...
...

Python相关问答推荐

如何根据另一列值用字典中的值替换列值

Python会扔掉未使用的表情吗?

从webhook中的短代码(而不是电话号码)接收Twilio消息

未删除映射表的行

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

Python+线程\TrocessPoolExecutor

如何在Python中找到线性依赖mod 2

改进大型数据集的框架性能

使用Python从rotowire中抓取MLB每日阵容

在Python中计算连续天数

Flask Jinja2如果语句总是计算为false&

通过追加列表以极向聚合

如何使用Azure Function将xlsb转换为xlsx?

如何在Gekko中处理跨矢量优化

read_csv分隔符正在创建无关的空列

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

极点用特定值替换前n行

Pandas ,快速从词典栏中提取信息到新栏

当lambda函数作为参数传递时,pyo3执行

如何使用count()获取特定日期之间的项目