使用for循环创建多个Tkinter页面

时间:2019-08-14 15:03:50

标签: python list class tkinter

我正在创建一个包含很多页面的Tkinter GUI。他们中的许多人具有不同数据库的相同显示。

我要在数据库列表之后创建多个页面

我在名为“数据库”的列表中有一个熊猫数据框列表,我想创建自动适合数据库的页面


global Pages
Pages=[]

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        Pages_List=[Studies_List]+Pages
        self.frames = {}
        for F in Pages_List: #dont forget to add the different pages
            frame = F(container, self)
            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(Studies_Page)

    def show_frame(self, c):

        frame = self.frames[c]
        frame.tkraise()

class Studies_Page(tk.Frame): #Should, from each Site, show only  the XRays corresponding to this Site. Plots sheet is an option too.
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent,background=bg_color)
        self.controller=controller
        tk.Label(self, text="Home > Studies ",bg=bg_color,font=('Arial',9,'italic')).pack(side='top')
        label = tk.Label(self, text="Choose the Study you want the data from :",bg=bg_color, font=TITLE_FONT) 
        label.pack(side="top", fill="x", pady=10)

        Studies_frame=tk.Frame(self,bg=bg_color)

        ############ Studies Buttons 
        for i in range(len(Databases)):
                tk.Button(Studies_frame, text=Pages[i]['Study'][0],command=lambda: controller.show_frame(Pages[i])).pack(in_=Studies_frame)
                tk.Label(Studies_frame, text=" ",bg=bg_color,font=('Arial',11,)).pack()

        Studies_frame.pack(expand=True,side='top')


for i in range(len(Databases)):
   class page(tk.Frame):
        def __init__(self,parent,controller):
            tk.Frame.__init__(self,parent)
            self.controller=controller

            df=Databases[i]
            f=tk.Frame(self)
            f.pack()
            self.table=pt=Table(f,dataframe=df)
            pt.show()

            return

    Pages.append(page)

if __name__ == "__main__":
    app = SampleApp()
    app.title("X-Rays App")
    app.mainloop()

这是特别需要的,因为我在起始页中有多个按钮,每个按钮都指向一个数据库。 我期望每个数据库都有一个页面,但是页面列表的每次出现都会返回最后一个列表。

我有很多用tkinter创建的页面,它们有很多共同点,所以我想以动态方式将列表与类一起使用,但我没有找到方法。 我尝试每次更改类名,但它仍返回数据库列表中的最后一个数据库

1 个答案:

答案 0 :(得分:2)

没有理由在for循环中多次重新定义class Page(tk.Frame):

您可能应该做的是在循环中创建该类的实例。

也许是这样的:

class Page(tk.Frame):
    def __init__(self, parent, controller, db_index):
        tk.Frame.__init__(self, parent)
        self.controller=controller
        self.db_index = db_index

        df = Databases[self.db_index]
        self.pack()
        self.table = Table(f, dataframe=df)
        pt.show()

pages = []
for idx in range(len(database_collection)):
    pages.append(Page(parent, controller, idx))   # create an instance of Page