我试图循环创建选项菜单,并且选项菜单的数量取决于变量。因此,我试图在代码中使用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)
答案 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())