我对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)交互,并且所有选择/更新功能将在子窗口中自包含。主菜单的唯一功能是打开应用程序的不同部分,它永远不需要直接访问子窗口的结果。
答案 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()