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

时间:2015-08-13 22:43:20

标签: drop-down-menu tkinter set python-3.4

我正在尝试根据集合中的数据填充菜单。唯一的问题是我希望以后能够根据所选的菜单项更改变量。我现在拥有的东西不能按预期工作。无论是否正在选择菜单中的项目,都会打印出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中的命令选项。我试图使用下面提到的lamba建议,但我仍然不确定如何做到这一点。我注意到,当没有将currentGenre分配给label时,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).  

1 个答案:

答案 0 :(得分:1)

您必须为菜单指定一个引用。这可以使用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?