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

Drop down menu Python:Tkinter:尝试使用集合动态填充菜单,drop-down-menu,tkinter,set,python-3.4,Drop Down Menu,Tkinter,Set,Python 3.4,我试图根据集合中的数据填充菜单。唯一的问题是,我希望以后能够根据所选的菜单项更改变量。我现在拥有的东西并不像预期的那样有效。无论是否选择菜单中的项目,都将打印出CurrentGene。有什么我遗漏的吗?我是否应该放弃这一思路,尝试另一种方法?我是否应该储存每个自我。genreMenu。。。我找了个地方,以便以后参考?谢谢 for g in genres: self.genreMenu.add_command(label=g) self.genreMenu.

我试图根据集合中的数据填充菜单。唯一的问题是,我希望以后能够根据所选的菜单项更改变量。我现在拥有的东西并不像预期的那样有效。无论是否选择菜单中的项目,都将打印出CurrentGene。有什么我遗漏的吗?我是否应该放弃这一思路,尝试另一种方法?我是否应该储存每个自我。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)
对于g类型:
self.genreMenu.add_命令(label=g)
self.genreMenu.bind(“,self.change\u流派(g))
印刷品(当前类型)
def更改类型(自我、标签):
全球流行流派
当前类型=标签
印刷品(当前类型)
我将代码改为使用add_命令中的命令选项。我已经尝试使用下面提到的lamba建议,但我仍然不确定如何做到这一点。我注意到,当不将currentgree分配给label时,currentgree会被打印出来,但当分配了currentgree时,除了最初的类型列表外,什么也不会被打印出来。这是完整的代码块。体裁是一套

    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).  
数据加载[“类型”]中的i的
:
对于i中的j:
添加(i[“名称”])
对于g类型:
流派菜单.append(self.genreMenu.add_命令(label=g,command=self.change_流派(g)))
#self.genreMenu.bind(“,lambda事件,g:self.change\u类型(事件,g))
def更改类型(自我、标签):
全球流行流派
当前类型=标签
打印(当前类型)。

您必须给菜单一个函数的引用。这可以通过创建匿名函数的
lambda
轻松完成。你可以让这个函数调用你真正的函数

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

有关lambda的更深入解释,请参见以下答案:

为什么要使用带有菜单的
bind
?您是否知道
命令
选项?您正在使用
self.genreMenu.bind(“,self.change\u流派(g))
将其更改为
self.genreMenu.bind(“,lambda事件,g:self.change\u流派(事件,g))
并向methodheader@Bryan Oakley添加
事件
,我最初使用命令选项,但由于它不起作用,我决定使用bind,认为这可能就是问题所在。@我尝试了你的建议。将事件添加到methodheader是什么意思?将其作为参数传入?我不太熟悉lamda的概念。但我怀疑我必须重命名该方法?而且我可能忘了提及,我不仅在循环集合时试图阻止当前类型打印,而且在循环完成后,我希望能够根据选择的内容打印出标签中存储的任何值的内容。非常感谢布莱恩!我将阅读该答案以了解更多信息。很快,但是为什么我必须给菜单一个函数的引用,而不是实际的函数?为什么直接使用函数时它不起作用?“对函数的引用”是“实际函数”。你需要给它函数,而不是函数的结果。当您执行
command=self.change\u-genre(g)
时,实际上您正在调用
self.change\u-genre(g)
,并将结果分配给该命令。这在我链接到的另一个答案中都有解释。