我正在创建一个包含很多页面的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创建的页面,它们有很多共同点,所以我想以动态方式将列表与类一起使用,但我没有找到方法。 我尝试每次更改类名,但它仍返回数据库列表中的最后一个数据库
答案 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