【问题标题】:Iteration produced Tkinter buttons won't respond to correct variables [duplicate]迭代产生的 Tkinter 按钮不会响应正确的变量 [重复]
【发布时间】:2016-07-09 19:11:36
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x tkinter ttk


    【解决方案1】:

    为了补充我之前的回答,有一个关于this issue 的 Python 常见问题解答。

    你的陈述

        self.pages[impname][impname + 'Button'] = tk.Button(
                self.pages[impname]['Page'],
                text='Activate',
                command=lambda: self.modload(self, controller, impname))
    

    等价于

        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)
    

    这是否更清楚每个 button_handler() 都做同样的事情? 事实上,我建议将您的代码修改为

        def button_command(self=self, controller=controller, impname=impname):
            return self.modload(self, controller, impname))
        self.pages[impname][impname + 'Button'] = tk.Button(
                self.pages[impname]['Page'],
                text='Activate',
                command=button_command)
    

    现在每个按钮命令都不同,因为默认参数是在定义函数时计算的。我总是在创建按钮之前定义按钮命令。不那么混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多