所以在下面的代码中我在tkinter中建立了一个Notebook。我从列表 VARS [“IMPS”]中提取字符串,并使用字符串作为键并将帧作为值在字典中创建页面。
当我建立按钮时,我的问题出现了,按钮激活的功能只是打印了impname。但是,当构建应用程序时,标签始终具有正确的内容和“impname”。笔记本中所有页面上的按钮始终打印列表 VARS [“IMPS”]中的最后一个字符串。为什么会这样?
Necromicon = ttk.Notebook(self)
self.pages = {}
for impname in __VARS__["IMPS"]:
page = {}
# Formate is Imp_acrobat.Imp()
# impname is a string
self.pages[impname] = page
self.pages[impname]["Page"] = ttk.Frame(Necromicon)
Necromicon.add(self.pages[impname]["Page"], text=impname[4:])
x = ttk.Label(self.pages[impname]['Page'], text=impname)
x.config(wraplength=175, font=SMALL_FONT)
x.config(background='black', foreground='red')
self.pages[impname]['Scroll'] = x
self.pages[impname][impname + 'Button'] = tk.Button(
self.pages[impname]['Page'],
text='Activate',
command=lambda: self.modload(self, controller, impname))
self.pages[impname]['Scroll'].pack(fill="both", expand=True)
self.pages[impname][impname + 'Button'].pack()
答案 0 :(得分:0)
要添加到我之前的答案,有一个关于this issue的Python常见问题解答。
您的陈述
with_index
相当于
self.pages[impname][impname + 'Button'] = tk.Button(
self.pages[impname]['Page'],
text='Activate',
command=lambda: self.modload(self, controller, impname))
这是否更清楚每个button_handler()做同样的事情? 事实上,我建议修改你的代码
def button_command(): return self.modload(self, controller, impname))
self.pages[impname][impname + 'Button'] = tk.Button(
self.pages[impname]['Page'],
text='Activate',
command=button_command)
现在每个按钮命令都不同,因为默认args是在定义函数时计算的。我更接近在创建按钮之前定义按钮命令。不那么容易混淆。