Python Tkinter中for循环中的选项菜单

时间:2018-09-04 06:05:30

标签: python user-interface tkinter

我试图循环创建选项菜单,并且选项菜单的数量取决于变量。因此,我试图在代码中使用exec。

我使用以下代码传递'i'的值,以连接到正在更改该值的变量。

但是,一旦我调用跟踪,我在“选项”菜单中选择的选项就不会在“选项”菜单框中更新。如果我不调用跟踪功能,那么它将在显示中得到更新。

trackProcessMenu是回调函数。

请让我知道我在哪里犯错。

添加我的代码:

for i in range(0,numOfLibFiles):
            exec('self.processOptionMenuVar_%d = StringVar()'%i)
            process_menu = ("ff","ss","tt","fff","sss","ttt")
            exec('self.processOptionMenu_%d = OptionMenu(self, self.processOptionMenuVar_%d, *process_menu )'%(i,i))
            exec('self.processOptionMenu_%d.config(indicatoron=0,compound=RIGHT,image= self.downArrowImage, anchor = CENTER , direction = RIGHT)'%i)
            exec('self.processOptionMenuVar_%d.set("--")'%i)
            exec('self.processOptionMenu_%d.grid(row = i, column =1, sticky = N ,padx=30, pady =7 )'%i)

def trackProcessMenu(self,*args):    
    i = args[0]
    exec('process = self.processOptionMenuVar_%d.get()'%i)

1 个答案:

答案 0 :(得分:0)

您不应以此方式使用exec。一条好的经验法则是,在回答“我为什么不应该使用exec的问题之前,您永远不要使用exec。 :-) exec有它的用途,但这不是其中之一。

不要试图自动生成变量名,而是将小部件保留在列表或字典中。

例如:

option_vars = []
option_menus = []

for i in range(0,numOfLibFiles):
    process_menu = ("ff","ss","tt","fff","sss","ttt")
    var = StringVar()
    om = OptionMenu(self, var, *process_menu)
    om.config(indicatoron=0,compound=RIGHT,image= self.downArrowImage, anchor = CENTER , direction = RIGHT)
    var.set("--")
    om.grid(row = i, column =1, sticky = N ,padx=30, pady =7)

    option_vars.append(var)
    option_menus.append(om)

有了上述内容,您现在可以使用简单的索引引用变量和菜单:

print("option 1 value is:", option_vars[1].get())