我挣扎着tkraise
没有隐藏'底部'在我的应用程序框架。
我有两个框架,一个包含一个列表框,并打包到左侧,另一个将显示列表框中每个项目的选项,并打包到右侧。
我的问题是,当我选择Future
时,我可以看到General
页面,反之亦然。我从我的工作主应用程序中复制并修改了它,但我不知道我做错了什么来打破它。
# All settings windows and forms labels are built in here
import tkinter as tk
# from main import WinSize
from tkinter import Listbox, END, ttk
class Settings(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# create frame for listbox and parameters area
self.list_container = ttk.Frame(self, relief='sunken')
self.list_container.pack(side='left', fill='y', expand=False)
self.param_container = ttk.Frame(self)
self.param_container.pack(side='top', fill='both', expand=True)
self.options_list = Listbox(self.list_container, selectmode='single')
for choice in ['General', 'Future']:
self.options_list.insert(END, choice)
self.okbutton = ttk.Button(self.param_container, text="OK", command= self.destroy)
self.okbutton.grid_rowconfigure(0, weight=1)
self.okbutton.grid_columnconfigure(0, weight=1)
self.okbutton.grid(row=2, column=2, sticky='nsew')
# Grid layout for Settings window
self.options_list.grid(row=0, column=0, sticky='nsew')
self.list_container.grid_rowconfigure(1, weight=1)
self.list_container.grid_columnconfigure(1, weight=1)
self.param_container.grid_rowconfigure(1, weight=1)
self.param_container.grid_columnconfigure(1, weight=1)
# create empty TUPLE for future frames
self.frames = {}
# generate calls for frames
for F in (General, Future):
self.page_name = F.__name__
self.frame = F(parent=self.param_container, controller=self)
self.frames[self.page_name] = self.frame
self.options_list.select_set(0)
self.options_list.bind("<<ListboxSelect>>", self.onselect)
self.options_list.event_generate("<<ListboxSelect>>")
# grab value of listbox selection and call show_frame
def onselect(self, event):
self.widget = event.widget
self.value = self.widget.get(self.widget.curselection())
print(self.value)
self.show_frame(self.value)
# show corresponding frame based on listbox selection
def show_frame(self, page_name):
# show a frame for the given page name
self.frame = self.frames[page_name]
self.frame.grid(row=0, column=1, sticky='nsew')
self.frame.tkraise()
print("Show Frame")
class General(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.optiontitle = ttk.Label(parent, text='General')
self.optiontitle.grid(row=0, column=0, sticky='nsew')
self.dirlabel = ttk.Label(parent, text='Default Save Directory')
self.dirlabel.grid(row=1, column=1, sticky='s')
class Future(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
test1 = ttk.Label(self, text='Future')
test1.pack()
app=Settings()
app.mainloop()
我想说这可能与我的网格布局有关,但是由于这两个页面没有任何意义。没有彼此耦合(或应该是)。
答案 0 :(得分:1)
我通过另一个问题解决了这个问题,我可以在其他人的帮助下解决这个问题。请参阅此→Frames not stacking on top of each other in tkinter问题,因为它有两个很好的答案,可以轻松地按照@jasonharper的建议合并grid_forget()
和/或pack_forget()
。
答案 1 :(得分:0)
你没有做任何实际隐藏其他页面的事情;你只是将新页面叠加在它上面,除非它们占据完全相同的屏幕区域,否则它看起来不会正确。
即使他们这样做了,这仍然不是一种可行的方法,因为隐藏页面中的小部件仍处于活动状态。特别是,如果它有任何Entry或Text字段,它们仍然可以拥有(或获得)键盘焦点,因此用户输入的任何内容都可能神秘地结束在他们目前甚至无法看到的字段中。
在显示新页面时,您应该在上一页上调用.grid_forget()
。或者,也许更容易,在所有页面上调用.grid_forget()
,然后在新页面上调用.grid()
(在当前未显示的小部件上调用此内容并不会造成伤害。)< / p>