Tkinter:不同尺寸的页面

问题描述 投票:0回答:1

如何使这些页面具有两种不同的尺寸?假设我要使StartPage变大,为500 x 500,New_Card_Page变小,例如为100 x100。App.geometry(“ 200x200”)更改所有页面,这不是我想要的。

from tkinter import *
from tkinter import ttk
LARGE_FONT=('Verdana', 12)

class Index_Cards_App(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 (StartPage, New_Card_Page):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)
    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()     

class StartPage(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label=Label(self, text='Index Cards')  
        label.pack(pady=10,padx=10)               
        button1 = ttk.Button(self, text='Enter New Card', command=lambda: controller.show_frame(New_Card_Page))
        button1.pack()      

class New_Card_Page(Frame): 
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label=ttk.Label(self, text='Enter New Card') 
        label.pack(pady=10,padx=10)          
        button1 = ttk.Button(self, text='Back to Home', command=lambda: controller.show_frame(StartPage)).pack() 

app=Index_Cards_App()
app.geometry("200x200")
app.mainloop()       
python tkinter
1个回答
0
投票
您复制的代码通过将所有页面相互堆叠来工作,并假定它们的大小都相同。这并不是一个很好的设计,特别是如果您只是在学习tkinter。

如果您希望每个页面都有自己的大小,最简单的解决方案是在最初创建页面时删除grid的使用,而是让show_frame删除当前页面并添加新页面。

首先,创建一个属性以保存当前页面,以便可以将其删除,然后在grid中的循环内删除对__init__的调用。另外,由于我们不再依赖于将页面堆叠在一起,因此可以删除用于配置网格的命令。

def __init__(self, *args, **kwargs): Tk.__init__(self, *args, **kwargs) container = Frame(self) container.pack(side='top', fill='both', expand=True) self.current_frame = None self.frames = {} for F in (StartPage, New_Card_Page): frame = F(container, self) self.frames[F] = frame self.show_frame(StartPage)

下一步,修改show_frame以隐藏当前页面并显示新页面。由于我们不再将小部件彼此堆叠,因此packgrid更简单:

def show_frame(self, cont): if self.current_frame is not None: self.current_frame.pack_forget() self.current_frame = self.frames[cont] self.current_frame.pack(fill="both", expand=True)

最后,在代码末尾删除对geometry的调用,因为这会将窗口强制为特定大小。

进行这些更改后,每个页面都会导致窗口调整大小以适合当前页面。

© www.soinside.com 2019 - 2024. All rights reserved.