如何在 Tkinter 中替换 labels/entries?

How to replace labels/entries in Tkinter?

def stand():
    e1 = Tkinter.Entry(main_window)
    e1.grid(row =6, column=3)
    e2 = Tkinter.Entry(main_window)
    e2.grid(row =7, column=3)
    e3 = Tkinter.Entry(main_window)
    e3.grid(row =8, column=3)
    e4 = Tkinter.Entry(main_window)
    e4.grid(row =9, column=3)
    e5 = Tkinter.Entry(main_window)
    e5.grid(row = 10, column = 3)
    e6 = Tkinter.Entry(main_window)
    e6.grid(row=11, column = 3)
    p1 = Tkinter.Label (main_window)
    p1.grid(row = 6, column =2)
    p2 = Tkinter.Label (main_window)
    p2.grid(row =7, column =2)
    p3 = Tkinter.Label (main_window)
    p3.grid(row = 8, column =2)
    p4 = Tkinter.Label (main_window)
    p4.grid(row =9 , column =2)
    p5 = Tkinter.Label (main_window)
    p5.grid(row =10 , column =2)
    p6 = Tkinter.Label (main_window)
    p6.grid(row =11 , column =2)

我需要删除这些并用不同的 entries/labels 替换它们,方法是按下一个按钮,删除那里的 entries/labels 并放置新的。我已经尝试了所有方法,但找不到解决方案:

NameError: global name 'e1' is not defined

有什么想法吗?

您可以在错误消息中看到问题:解释器认为 e1 是全局名称(以及其他小部件),但您在局部范围内的 stand() 中定义了它,所以你程序的其他部分不知道它。有多种解决方案。一种解决方案是使其成为全球性的:

e1 = Tkinter.Entry(main_window)
def stand():
    global e1
    e1.grid(row =6, column=3)

我真的不喜欢那样做。另一种解决方案是转向面向对象的方法:

class App(object):
    ...
    def stand():
        self.e1 = Tkinter.Entry(main_window)
        self.e1.grid(row =6, column=3)

    def access():
        print(self.e1) # can access it

另一个解决方案是将小部件作为参数传递给其他函数:

def stand():
    self.e1 = Tkinter.Entry(main_window)
    self.e1.grid(row =6, column=3)

def access(widget):
    print(widget)

最后,您应该通过重新配置小部件来重新配置小部件,而不是删除它们并创建新的小部件:

e1.config(width=30)
p1.config(text="New Text")