我正在一个窗口中创建一个包含两个框架的程序。第一个是输入字段,第二个是创建图形。 我找到了一种从列表中动态创建输入字段并相应获取其值的方法,但我无法在窗口中显示它们。当我运行程序时,它显示一个空窗口。
如何在第一帧(InputPage)上显示标签和输入小部件?我尝试过改变父母的问题。自我'但它没有任何区别。我不太了解多帧应用程序中小部件的结构。
这是我的代码:
from tkinter import *
namesInput = ["first", "second", "third", "fourth", "fifth"]
entryInput = {}
labelInput = {}
root = Tk()
class ZorgplanGrafiek(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
container = Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (InputPage, GraphPage):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(InputPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class InputPage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self,parent)
label = Label(self, text="Zorgplan input")
label.pack(pady=10,padx=10)
i = 0
for name in namesInput:
e = Entry(self)
entryInput[name] = e
lb = Label(self, text=name)
labelInput[name] = lb
i += 1
#def print_all_entries():
# for name in namesInput:
# print( entryInput[name].get())
class GraphPage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
label = Label(self, text="The graph will show here")
label.pack(pady=10,padx=10)
button = Button(self, text="Back to Home",
command=lambda: controller.show_frame(InputPage))
button.pack()
app = ZorgplanGrafiek()
app.mainloop()
答案 0 :(得分:3)
首先删除代码顶部的root = Tk(),创建2个窗口。其次,你创建条目和标签小部件的循环是不正确的,因此它们不会显示在框架上,因此这就是他们为什么不显示的答案。
试试这个:
class InputPage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self,parent)
label = Label(self, text="Zorgplan input")
label.grid(row=0, column=0, sticky ='n', columnspan =2)
# i brought your variable in the class for example sake
namesInput = ["First:", "second:", "Third:", "Fourth:", "Fifth:"]
self.entryWidgets = [] # we want to call this in another function so we assign it as self.variableName
labelWidgets = []
#LOOP TO CREATE WIDGETS
for i in range(0, len(namesInput)):
labelWidgets.append(Label(self, text = namesInput[i]))
self.entryWidgets.append(Entry(self))
labelWidgets[-1].grid(row= i+1, column =0, sticky='e')
self.entryWidgets[-1].grid(row= i+1, column = 1, sticky='w')
submit = Button(self, text = "Submit", command = self.getEntries)
submit.grid(row = 6, column =0, columnspan =2)
def getEntries(self):
results = []
for x in self.entryWidgets: # i.e for each widget in entryWidget list
results.append(x.get())
print(results)
代码说明:
我们正在迭代地为namesInput列表中的元素数创建小部件。每次我们创建一个小部件时,我们都会将它添加到各自的列表中例如,对于条目小部件,我们创建了一个名为entryWidgets的列表。我们将它们附加到列表中,以便我们稍后可以在我们想要对它们执行某些操作时单独引用它们。
此外,我将pack()更改为grid()。在我看来,网格方法更清晰,让我们可以更好地控制窗口的布局。
注意 - 如果你正在努力理解我是如何按照我的方式对小部件进行“磨练”的,我只是画出了小部件的快速草图,其中坐标表示它们的行和列,然后从那里开始很容易看到如何操纵for循环中的网格设置。