首页 > 解决方案 > 如何将变量从 tkinter 表单传递给不同的函数?

问题描述

我正在尝试为一些使用具有多种形式的 tkinter 并以不同功能访问表单数据的高中生做一个例子。我试图使示例保持简单,但有一个小问题。sv3&sv4变量没有从第二种形式中获取值。有什么建议或想法吗?

from tkinter import *
root = Tk()

sv1 = StringVar()
sv2 = StringVar()
sv3 = StringVar()
sv4 = StringVar()

#first function - this DOES NOT take text from entry widgets and displays, but should
def callback2():
    test2 = sv3.get()
    print(test2)
    print (sv4.get())
    print("show second form entry widgets values")
    return True

#first function - this takes text from entry widgets and displays
def callback():
    test = sv1.get()
    print(test)
    print (sv2.get())
    print("show first form entry widgets values")
    new_form()
    return True

#new form
def new_form():
    newfrm = Tk()
    entry3 = Entry(newfrm, textvariable=sv3).pack()
    entry4 = Entry(newfrm, textvariable=sv4).pack()
    button = Button(newfrm, text="Click Me", command=callback2).pack()
    newfrm.mainloop()

#initial form
def main_form():
    entry1 = Entry(root, textvariable=sv1).pack()
    entry2 = Entry(root, textvariable=sv2).pack()
    button = Button(root, text="Click Me", command=callback).pack()
    root.mainloop()

main_form()

标签: pythonfunctiontkinter

解决方案


这里如何避免使用多个Tk实例手动将值从前两个Entrys 传输到第二对。请参阅带有####注释的行。

from tkinter import *
root = Tk()

sv1 = StringVar()
sv2 = StringVar()
sv3 = StringVar()
sv4 = StringVar()

#first function - this now take text from entry widgets and displays as it should.
def callback2():
    test2 = sv3.get()
    print(test2)
    print (sv4.get())
    print("show second form entry widgets values")
    return True

#first function - this takes text from entry widgets and displays
def callback():
    test = sv1.get()
    print(test)
    print (sv2.get())
    print("show first form entry widgets values")
    new_form()
    return True

#new form
def new_form():
####    newfrm = Tk()
    newfrm = Toplevel()  #### Instead.
    sv3.set(sv1.get())  #### Trasfer value.
    sv4.set(sv2.get())  #### Trasfer value.
    entry3 = Entry(newfrm, textvariable=sv3).pack()
    entry4 = Entry(newfrm, textvariable=sv4).pack()
    button = Button(newfrm, text="Click Me", command=callback2).pack()
    newfrm.mainloop()

#initial form
def main_form():
    entry1 = Entry(root, textvariable=sv1).pack()
    entry2 = Entry(root, textvariable=sv2).pack()
    button = Button(root, text="Click Me", command=callback).pack()
    root.mainloop()

main_form()


推荐阅读