python tkinter 中的动态表单小部件交互

Dynamic Form Widget interaction in python tkinter

我正在尝试生成一个空白 GUI,其中包含 1 个菜单项。

然后,当从菜单项中进行选择时,我使用函数在同一表单上生成标签、按钮和条目小部件。

但是,当我尝试使用 get() 方法获取生成的文本框中输入的值时,出现错误。我可能在这里错过了一些核心概念,这可能是不可能的,但我想知道。以下是我的代码,

from tkinter import Tk, Label, Button, Entry, Menu

def btn_clientadd():
    print(txt1.get())

def addclient():
    lbl1 = Label(window, text="Client Name :")
    lbl1.grid(row=1,column=1,padx=7,pady=7,sticky='e')

    txt1 = Entry(window)
    txt1.grid(row=1, column=2)
    txt1.focus()

    btn = Button(window, text="Add Client", command=btn_clientadd)
    btn.grid(row=2,column=2,padx=7,pady=7)

window = Tk()
window.geometry('400x200')

menu = Menu(window)
new_item1 = Menu(menu)

menu.add_cascade(label='ClientMaster', menu=new_item1)
new_item1.add_command(label='Add New Client', command=addclient)

window.config(menu=menu)

window.mainloop()

条目 txt1 在函数内部创建,并且在函数结束时对它的引用被垃圾回收。解决此问题的一种方法是在全局范围内声明一个 StringVar(),然后将其关联到条目。

检查下面的示例:

from tkinter import Tk, Label, Button, Entry, Menu, StringVar

def btn_clientadd():
    print(client_string.get()) # Get contents of StringVar

def addclient():
    lbl1 = Label(window, text="Client Name :")
    lbl1.grid(row=1,column=1,padx=7,pady=7,sticky='e')

    # Create entry and associate it with a textvariable
    txt1 = Entry(window, textvariable=client_string)
    txt1.grid(row=1, column=2)
    txt1.focus()

    btn = Button(window, text="Add Client", command=btn_clientadd)
    btn.grid(row=2,column=2,padx=7,pady=7)

window = Tk()
window.geometry('400x200')

menu = Menu(window)
new_item1 = Menu(menu)
menu.add_cascade(label='ClientMaster', menu=new_item1)
new_item1.add_command(label='Add New Client', command=addclient)
window.config(menu=menu)

client_string = StringVar() # StringVar to associate with entry

window.mainloop()