代码之家  ›  专栏  ›  技术社区  ›  babsdoc

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

  •  0
  • babsdoc  · 技术社区  · 7 年前

    我正在尝试生成一个带有1个菜单项的空白GUI。

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

    但是,当我尝试使用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()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   figbeam    7 年前

    条目 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()