如何使用循环创建和显示多个小部件(Tkinter)

时间:2018-02-14 21:48:35

标签: python python-3.x tkinter widget

我正在一个窗口中创建一个包含两个框架的程序。第一个是输入字段,第二个是创建图形。 我找到了一种从列表中动态创建输入字段并相应获取其值的方法,但我无法在窗口中显示它们。当我运行程序时,它显示一个空窗口。

如何在第一帧(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()

1 个答案:

答案 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循环中的网格设置。

截图: enter image description here