Python tkinter - 获取toplevel字段的值

时间:2016-03-06 22:34:33

标签: python python-3.x tkinter

我对python很新,并且正在努力解决tkinter的问题。我正在尝试创建一个具有主菜单的应用程序,其中包含用于打开包含不同功能的子窗口的按钮。我可以创建子窗口,但是我无法在子窗口中获取Entry小部件中输入的值。我写了一个非常简化的版本(python 3):

from tkinter import (Frame, Label, Entry, StringVar, Toplevel, Tk, Button)


class main(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.minsize(width=250, height=250)
        self.master.title("main window")
        self.grid()

        newWindowButton = Button(self,
                                 text="open new window",
                                 command=self.newWindowOpen)
        newWindowButton.grid(row=0, column=0)

    def newWindowOpen(self):
        childWindow = Toplevel()
        childWindow.wm_title("child window")

        childWindow.itemLabel = Label(childWindow, text="Test Value")
        childWindow.itemVar = StringVar()
        childWindow.itemEntry = Entry(childWindow,
                                      textvariable=childWindow.itemVar)

        childWindow.itemLabel.grid(row=0, column=0)
        childWindow.itemEntry.grid(row=0, column=1)

        childWindow.submitButton = Button(childWindow,
                                          text="submit",
                                          command=self.submitTest)

        childWindow.submitButton.grid(row=1, column=0)

    def submitTest(self):
        value = self.itemVar.get()
        print(value)

root = Tk()
main_menu = main()
main_menu.mainloop()

这不起作用,因为submitTest试图获取'main.itemVar'的值,这当然不存在。

我猜测方法submitTest超出了childWindow小部件的范围,但我不确定如何正确地传递itemVar。这样做的正确方法是什么?我可以更好地创建childWindow作为它自己的类,并通过主菜单创建新对象吗?

对于后台,子窗口将与数据库(sqlite)交互,并且所有选择/更新功能将在子窗口中自包含。主菜单的唯一功能是打开应用程序的不同部分,它永远不需要直接访问子窗口的结果。

1 个答案:

答案 0 :(得分:0)

据我所知,您的应用程序可以创建更多的一个子窗口。因此,您无法创建一个self.itemVar。您可以在key中创建具有childwindow实例的dict,并在valueVar中创建itemVar实例。你可以在submitTest中传递childWindow上的实例。然后您可以访问相应的itemVar

from tkinter import (Frame, Label, Entry, StringVar, Toplevel, Tk, Button)


class main(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.minsize(width=250, height=250)
        self.master.title("main window")
        self.grid()
        self.children_dict = dict()

        newWindowButton = Button(self,
                                 text="open new window",
                                 command=self.newWindowOpen)
        newWindowButton.grid(row=0, column=0)

    def newWindowOpen(self):
        childWindow = Toplevel()
        childWindow.wm_title("child window")

        childWindow.itemLabel = Label(childWindow, text="Test Value")
        childWindow.itemVar = StringVar()
        childWindow.itemEntry = Entry(childWindow,
                                      textvariable=childWindow.itemVar)

        self.children_dict[childWindow] = childWindow.itemVar
        childWindow.itemLabel.grid(row=0, column=0)
        childWindow.itemEntry.grid(row=0, column=1)

        childWindow.submitButton = Button(childWindow,
                                          text="submit",
                                          command=lambda: self.submitTest(childWindow))

        childWindow.submitButton.grid(row=1, column=0)

    def submitTest(self, childWindow):
        value = self.children_dict[childWindow].get()
        print(value)

root = Tk()
main_menu = main()
main_menu.mainloop()