代码之家  ›  专栏  ›  技术社区  ›  Ian

我已经使用while循环创建了多个tkinter条目小部件,并且在为每个小部件定义单独的变量时遇到了问题

  •  1
  • Ian  · 技术社区  · 7 年前

    normval_f= IntVar()
        x= samp.get()
        f=1
        while f<=x:
            f_entry = ttk.Entry(mainframe, width=7, textvariable=normval_f)
            f_entry.grid(column=1, row=f+12)
            f_label = ttk.Label(mainframe, text="Sample "+str(f)+ " value").grid(column=2, row=f+12, sticky=W)
            f=f+1        
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Mike - SMT    7 年前

    当处理大量或可能大量的小部件时,列表和字典非常有用。

    下面是一些代码,用于完成您在问题中描述的内容。

    我使用一个名为 self.my_entries 存储将根据用户键入内容的值创建的所有条目。我还添加了一些错误处理,以防用户尝试键入数字以外的内容,或者按下按钮时没有输入任何内容。

    第一个条目和按钮放置在根窗口上,对于将要创建的所有条目字段,我们在第一个按钮下方添加一个框架。如果我们想稍后重置字段,这将允许我们更轻松地管理输入字段。

    from tkinter import *
    
    
    class Example(Frame):
    
    
        def __init__(self):
            Frame.__init__(self)
    
            self.pack()   
            self.my_entries = []
    
            self.entry1 = Entry(self)
            self.entry1.grid(row = 0, column = 0)
            Button(self, text="Set Entry Fields", command=self.create_entry_fields).grid(row = 1, column = 0)
    
            self.frame2 = Frame(self)
            self.frame2.grid(row = 2, column = 0)
    
        def create_entry_fields(self):
            x = 0
            try:
                x = int(self.entry1.get())
                if x != 0:
                    for i in range(x):
                        self.my_entries.append(Entry(self.frame2))
                        self.my_entries[i].grid(row=i, column=1)
                        f_label = Label(self.frame2, text="Label {}: ".format(i+1))
                        f_label.grid(row=i, column=0)
                Button(self.frame2, text="Print to console", command=self.print_all_entries).grid(row=x, column=0, sticky = "nsew")
                Button(self.frame2, text="Reset", command=self.clear_frame2).grid(row=x, column=1, sticky = "nsew")
            except:
                print("Invalid entry. Only numbers are allowed.")
    
        def print_all_entries(self):
            for i in self.my_entries:
                print(i.get())
    
        def clear_frame2(self):
            self.my_entries = []
            self.frame2.destroy()
            self.frame2 = Frame(self)
            self.frame2.grid(row = 2, column = 0)
    
    
    if __name__ == '__main__':
        root = Tk()
        test_app = Example()
        root.mainloop()
    

        2
  •  0
  •   scotty3785    7 年前

    几点建议;不要使用while循环,而是使用for循环。其次,我建议将每个变量存储在一个列表中,或者像我所做的那样,存储在一个列表中。目前,每次通过循环时都会覆盖变量,因此每次都需要创建一个新的变量并将其存储在某处。

    from tkinter import *
    
    class App(Frame):
        def __init__(self,master):
            Frame.__init__(self, master)
            fields = ['name','age','gender']
            self.field_variables = {}
            for idx,field in enumerate(fields):
                self.field_variables[field] = StringVar()
                f_entry = Entry(self,textvariable=self.field_variables[field])
                f_entry.grid(column=2,row=idx)
                f_label = Label(self,text=field)
                f_label.grid(column=1,row=idx)
    
            go_btn = Button(self,text="Go",command=self.get_all)
            go_btn.grid()
    
        def get_all(self):
            print(self.field_variables)
    
    if __name__ == '__main__':
        root = Tk()
        app = App(root)
        app.grid()