Python:Tkinter:尝试使用集合动态填充菜单

Python: Tkinter: Trying to Populate a Menu Dynamically With a Set

我正在尝试根据一组数据填充菜单。唯一的问题是我希望以后能够根据所选的菜单项更改变量。我目前拥有的功能无法按预期工作。无论菜单中的项目是否被选中,CurrentGenre 都会被打印出来。有什么我想念的吗?我是否应该放弃这种思路并尝试其他方法?我是否应该存储每个 self.genreMenu... 我制作的某个地方以便我以后可以参考它们?谢谢

    for g in genres:
        self.genreMenu.add_command(label=g)
        self.genreMenu.bind("<Button-1>", self.change_genre(g))

        print(currentGenre)

def change_genre(self, label):
    global currentGenre

    currentGenre = label
    print (currentGenre)

我更改了我的代码以使用 add_command 中的命令选项。我试过使用下面提到的兰巴建议,但我仍然不确定该怎么做。我注意到,当没有将 currentGenre 分配给标签时,currentGenre 会被打印出来,但是当被分配时,除了流派的初始列表之外,什么都没有打印出来。这是完整的代码块。流派是一个集合。

    for i in data_load["genres"]:
        for j in i:
            genres.add(i["name"])

    for g in genres:
        genre_menus.append(self.genreMenu.add_command(label=g, command=self.change_genre(g)))

        #self.genreMenu.bind("<Button-1>", lambda event, g: self.change_genre(event, g))

def change_genre (self, label):
    global currentGenre
    currentGenre = label
    print (currentGenre).  

您必须给菜单一个引用一个功能。这可以使用 lambda 轻松完成,它创建一个匿名函数。您可以让该函数调用您的真实函数。

for g in genres:
    self.genreMenu.add_command(label=g, 
        command=lambda genre=g: self.change_genre(genre))

有关 lambda 的更深入解释,请参阅此答案:Why is Button parameter “command” executed when declared?