我需要从窗口中的条目中获取一些输入值,但每次返回窗口时,我都需要将这些值保存在条目小部件中。我写了这样的代码:
class Mainwindows:
def __init__(self, master):
self.master = master
self.mainframe = LabelFrame(self.master)
self.sinputbutton = Button(self.mainframe, text="INPUT", command=self.openinput)
self.sinputbutton.pack()
def openinput(self):
self.inputwindow = Toplevel(self.master)
self.app = Sinput(self.inputwindow)
class Sinput:
def __init__(self, master):
self.master = master
self.inputframe = Frame(self.master)
self.stuffinput = DoubleVar()
self.stuffinput = Entry(self.inputframe, textvariable=self.stuffinput)
self.stuffinput.pack()
self.okbutton = Button(self.inputframe, text="Ok", command=self.inputok)
self.soilbutton.pack(side="right", padx=5, pady=10)
self.inputframe.pack()
def inputok(self):
global f
f = self.stuffinput.get()
self.master.destroy()
所以我将输入放入条目中,然后按下 okbutton,此时变量 f 被存储并且输入窗口关闭,但是如果我设法返回输入窗口,值恰好是 0,我需要它保留为我最初写的值!
更新的代码
import tkinter as tk
class Mainwindows:
def __init__(self, master):
self.master = master
self.mainframe = tk.Frame(self.master)
self.mainframe.pack()
# Create the variable in the main class
self.inputVar1 = tk.DoubleVar()
self.inputVar2 = tk.DoubleVar()
self.sinputbutton = tk.Button(self.mainframe, text="INPUT", command=self.openinput)
self.sinputbutton.pack()
# Temp button to display value
self.displaybutton = tk.Button(self.mainframe, text="Display", command=self.display)
self.displaybutton.pack()
def openinput(self):
self.inputwindow = tk.Toplevel(self.master)
# Pass an instance of the DoubleVar into Sinput class
self.app = Sinput(self.inputwindow, self.inputVar1, self.inputVar2)
# Temp function to show value
def display(self):
print(self.inputVar.get())
class Sinput:
def __init__(self, master, var):
self.master = master
self.var = var
self.inputframe = tk.Frame(self.master)
self.inputframe.pack()
self.stuffinput = tk.Entry(self.inputframe, textvariable=self.var)
self.stuffinput.pack()
self.okbutton = tk.Button(self.inputframe, text="Ok", command=self.inputok)
self.okbutton.pack(side="right", padx=5, pady=10)
def inputok(self):
self.master.destroy()
if __name__ == '__main__':
root = tk.Tk()
app = Mainwindows(root)
root.mainloop()
和以前一样,我需要存储通过将它们键入到位于输入窗口中的两个 entrywidget 中创建的变量,因为我稍后将需要这些值,如果我决定回来进一步查看,还需要将这些值显示在输入窗口中!
您遇到的主要问题是您破坏了窗口,然后在每次单击按钮时创建一个新窗口。在下面的示例中,我在主类中具有DoubleVar
。这样它就不会每次都被摧毁。但是,每次创建新窗口时,它都将使用相同的DoubleVar
因此每个条目小部件将显示它持有的当前值。
现在,尽管您可以在DoubleVar
上使用全局以在类之间使用它。使用课程时,我更喜欢远离它。要在没有全局的情况下执行此操作,您只需传入变量即可。
import tkinter as tk
class Mainwindows:
def __init__(self, master):
self.master = master
self.mainframe = tk.Frame(self.master)
self.mainframe.pack()
# Create the variable in the main class
self.inputVar = tk.DoubleVar()
self.sinputbutton = tk.Button(self.mainframe, text="INPUT", command=self.openinput)
self.sinputbutton.pack()
# Temp button to display value
self.displaybutton = tk.Button(self.mainframe, text="Display", command=self.display)
self.displaybutton.pack()
def openinput(self):
self.inputwindow = tk.Toplevel(self.master)
# Pass an instance of the DoubleVar into Sinput class
self.app = Sinput(self.inputwindow, self.inputVar)
# Temp function to show value
def display(self):
print(self.inputVar.get())
class Sinput:
def __init__(self, master, var):
self.master = master
self.var = var
self.inputframe = tk.Frame(self.master)
self.inputframe.pack()
self.stuffinput = tk.Entry(self.inputframe, textvariable=self.var)
self.stuffinput.pack()
self.okbutton = tk.Button(self.inputframe, text="Ok", command=self.inputok)
self.okbutton.pack(side="right", padx=5, pady=10)
def inputok(self):
self.master.destroy()
if __name__ == '__main__':
root = tk.Tk()
app = Mainwindows(root)
root.mainloop()
作为旁注,如果您希望消息框获取用户输入并返回值而不是创建自己的值,您还可以查看tkinter.simpledialog.askstring
。