如何有效地将变量转换为硬编码值

时间:2016-05-11 12:41:07

标签: python variables tkinter

我在级联菜单栏中有一个名称列表,当您单击一个名称时,我希望将关联的ID传递给一个函数。例如,如果您点击' Test1'它将id 4556767传递给函数。

我无法弄清楚该怎么做。我已经尝试使用enumerate将一个整数传递给lambda函数作为'命令'参数然后设置与菜单项索引对应的ID列表。然而,这并不是因为枚举变量当然随每次迭代而变化,所以最后每个项都返回相同的值。

有没有办法让变量永久保留而不是像硬编码那样改变而不是变量?

这是我目前的代码:

blogs = database_handler.get_blogs()                                    
self.blog_menu_ids = []                                                 

for i, blog in enumerate(blogs):                                        
    self.blog_menu_ids.append(blog[0])                                  
    self.menu_blogs.add_command(label=blog[1],                          
                                command=lambda: self.load_blog(i)) 

虽然如果我能做到这一点,我可以像这样立即传递id:

blogs = database_handler.get_blogs()                                               

for blog in blogs:                                                      
    self.menu_blogs.add_command(label=blog[1],                          
                                command=lambda: self.load_blog(blog[0])) 

2 个答案:

答案 0 :(得分:3)

您想要使用“部分功能应用程序”进行“早期绑定”:

from functools import partial

for i, blog in enumerate(blogs):
    self.blog_menu_ids.append(blog[0])
    self.menu_blogs.add_command(label=blog[1],
                                command=partial(self.load_blog, i))

或者按照你的第二个例子:

for blog in blogs:
    self.menu_blogs.add_command(label=blog[1],   
                                command=partial(self.load_blog, blog[0]))

答案 1 :(得分:0)

我似乎完全不理解你的问题,但你不是已经非常接近了吗?

for blog in blogs:                                                                         
    self.menu_blogs.add_command(label=blog[1], command=lambda: self.load_blog(blog[0]))

我认为blog[0]拥有ID,blog[1]是其名称。

编辑:我看到你编辑了所以我们现在有了相同的答案。