почему на начальной странице отображается метка "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()