如何链接在for循环中创建的pythontkinter小部件?

2024-05-19 22:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用for循环创建按钮和条目(state=disabled)小部件。要创建的小部件数量将作为运行时参数。我想要的是,每次我点击按钮,相应的条目就会被启用(state=“normal”)。我代码中的问题是,我单击的任何按钮都只影响最后一个条目小部件。有什么办法解决这个问题吗。?这是我的代码:

from tkinter import *

class practice:
    def __init__(self,root):
        for w in range(5):
            button=Button(root,text="submit",
                command=lambda:self.enabling(entry1))
            button.grid(row=w,column=0)
            entry1=Entry(root, state="disabled")
            entry1.grid(row=w,column=1)

    def enabling(self,entryy):
        entryy.config(state="normal")

root = Tk()
a = practice(root)
root.mainloop()

Tags: 代码selffor部件def条目buttonroot
2条回答

你的代码中有几个问题-

  1. 您应该保留buttons和您正在创建的条目,并将它们保存在一个实例变量中,最好将它们存储在一个列表中,然后w将是列表中每个按钮/条目的索引。

  2. 当你做lambda: something(some_param)时,some_param()的函数值不会被替换,直到函数被实际调用时,它正在为entry1处理最新的值,因此出现了问题。您不应该依赖于它,而是应该使用^{}并发送Button/Entry的索引来启用。

示例-

from tkinter import *
import functools

class practice:
    def __init__(self,root):
        self.button_list = []
        self.entry_list = []
        for w in range(5):
            button = Button(root,text="submit",command=functools.partial(self.enabling, idx=w))
            button.grid(row=w,column=0)
            self.button_list.append(button)
            entry1=Entry(root, state="disabled")
            entry1.grid(row=w,column=1)
            self.entry_list.append(entry1)

    def enabling(self,idx):
            self.entry_list[idx].config(state="normal")


root = Tk()
a = practice(root)

root.mainloop()

每当人们对用lambda表达式而不是def语句创建的函数有问题时,我建议用def语句重写代码,直到它正常工作为止。下面是对代码最简单的修复:它重新排列小部件的创建顺序,并将每个条目作为默认参数绑定到一个新函数。在

from tkinter import *

class practice:
    def __init__(self,root):
        for w in range(5):
            entry=Entry(root, state="disabled")
            button=Button(root,text="submit",
                command=lambda e=entry:self.enabling(e))
            button.grid(row=w,column=0)
            entry.grid(row=w,column=1)

    def enabling(self,entry):
        entry.config(state="normal")

root = Tk()
a = practice(root)
root.mainloop()

相关问题 更多 >