Рамки разных размеров - PullRequest
1 голос
/ 13 февраля 2020

Как я могу сделать эти страницы двух разных размеров? Скажем, я хочу сделать StartPage большим, 500 x 500 и New_Card_Page маленьким, скажем, 100 x 100. 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()       

1 Ответ

1 голос
/ 13 февраля 2020

Код, который вы скопировали, работает, укладывая все страницы друг на друга, и предполагает, что все они имеют одинаковый размер. Это не совсем хороший дизайн, особенно если вы только изучаете tkinter.

Если вы хотите, чтобы каждая страница имела свой собственный размер, самое простое решение - это исключить использование grid, когда страницы изначально создали, и вместо этого show_frame удалите текущую страницу и добавьте новую страницу.

Сначала создайте атрибут для хранения текущей страницы, чтобы его можно было удалить, и удалите вызов для grid внутри L oop в __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, чтобы скрыть текущую страницу и показать новую страницу. Поскольку мы больше не накладываем друг на друга виджеты, pack является более простым выбором, чем grid:

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 в конце вашего кода. , поскольку это заставляет окно к определенному c размеру.

С этими изменениями каждая страница приведет к изменению размера окна в соответствии с текущей страницей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...