почему на начальной странице отображается метка "lorem" подкадра первой страницы?

Я слежу за ответом: переключаться между двумя кадрами в tkinter

в приведенном ниже коде я создаю форму с двумя страницами, стартовой и первой, вопрос в том, почему метка "lorem" субфрейма первой страницы отображается на начальной странице, поскольку это часть субфрейма кадр первой страницы?

       import tkinter as tk                # python 3
from tkinter import font as tkfont  # python 3

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")

        container = tk.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, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

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

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is the start page", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)

        button1 = tk.Button(self, text="Go to Page One", command=lambda: controller.show_frame("PageOne"))
        button2 = tk.Button(self, text="Go to Page Two", command=lambda: controller.show_frame("PageTwo"))
        button1.pack()
        button2.pack()


class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 1", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage"))
        button.pack()

        frame1 = tk.Frame(self).pack()
        tk.Label(frame1, text='lorem', font=controller.title_font).pack()


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

2 ответа

Проблема решается упаковкой "frame1" в следующую строку, например:

        frame1 = tk.Frame(self)
        frame1.pack()

теперь содержимое "frame1" отображается только в "frame1", а не в других кадрах.

'frame1' кажется неограниченным из локальной области PageOne. Я смотрел на это некоторое время и думаю, что это из-за этого for F in... цикл просто установка parent=container для всех кадров, где container это корневое окно.

Если вы укажете PageOne's self в качестве родителя метки вместо frame1, затем отобразится ОК.

#! /usr/bin/env python3

import tkinter as tk
from tkinter import font as tkfont  ## python 3

class SampleApp( tk .Tk ):

    def __init__( self,  *args,  **kwargs ):
        tk .Tk .__init__( self,  *args,  **kwargs )

        self .title_font = tkfont .Font( family='Helvetica',  size=18,  weight='bold',  slant='italic' )

        container  = tk .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, PageOne, PageTwo ):
            page_name  = F .__name__
            frame  = F( parent=container,  controller=self )
            self .frames[ page_name ]  = frame
            frame .grid( row=0,  column=0,  sticky='nsew' )

        self .show_frame( 'StartPage' )

    def show_frame( self,  page_name ):
        '''Show a frame for the given page name'''
        frame = self .frames[ page_name ]
        frame .tkraise()


class StartPage( tk .Frame ):
    def __init__( self,  parent,  controller ):
        tk .Frame .__init__( self,  parent )
        self .controller  = controller
        tk .Label( self,  text='This is the start page',  font=controller .title_font ) .pack( side='top',  fill='x',  pady=10 )
        tk .Button( self,  text='Go to Page One',  command=lambda: controller .show_frame('PageOne') ) .pack()
        tk .Button( self,  text='Go to Page Two',  command=lambda: controller .show_frame('PageTwo') ) .pack()


class PageOne( tk .Frame ):
    def __init__( self,  parent,  controller ):
        tk .Frame .__init__( self,  parent )
        self .controller  = controller
        tk .Label( self,  text='This is page 1',  font=controller .title_font ) .pack( side='top',  fill='x', pady=10 )
        tk .Button( self,  text='Go to the start page',  command=lambda: controller .show_frame('StartPage') ) .pack()
        tk .Label( self,  text='lorem',  font=controller .title_font ) .pack()


class PageTwo( tk .Frame ):
    def __init__( self,  parent,  controller ):
        tk .Frame .__init__( self,  parent )
        self .controller = controller
        tk .Label( self,  text='This is page 2',  font=controller .title_font ) .pack( side='top',  fill='x',  pady=10 )
        tk .Button( self,  text='Go to the start page',  command=lambda: controller .show_frame('StartPage') ) .pack()
        tk .Label( self,  text='ipsum',  font=controller .title_font ) .pack()


if __name__ == '__main__':
    app  = SampleApp()
    app .mainloop()
Другие вопросы по тегам