迭代产生的Tkinter按钮不会响应正确的变量

时间:2016-07-09 19:11:37

标签: python python-3.x tkinter ttk

所以在下面的代码中我在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()

1 个答案:

答案 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是在定义函数时计算的。我更接近在创建按钮之前定义按钮命令。不那么容易混淆。