Python 在添加框架来组织我的程序时没有什么困难
我在Tkinter文本编辑器应用程序中使用此代码在帧之间导航。当我想用多个框架组织pageone以收集同一框架中的所有按钮和其他可能框架中的其他小部件时,我遇到了一个错误:\u tkinter.TclError:无法在内部使用geometry manager网格。它已经有了由pack管理的奴隶。如果你能帮我,泰 这是我使用的代码Python 在添加框架来组织我的程序时没有什么困难,python,tkinter,Python,Tkinter,我在Tkinter文本编辑器应用程序中使用此代码在帧之间导航。当我想用多个框架组织pageone以收集同一框架中的所有按钮和其他可能框架中的其他小部件时,我遇到了一个错误:\u tkinter.TclError:无法在内部使用geometry manager网格。它已经有了由pack管理的奴隶。如果你能帮我,泰 这是我使用的代码 import tkinter as tk from tkinter import ttk LARGE_FONT=("Verdana",12) d
import tkinter as tk
from tkinter import ttk
LARGE_FONT=("Verdana",12)
def popupmsg(msg):
popup=tk.Tk()
popup.wm_title("!")
label=ttk.Label(popup,text=msg,font=LARGE_FONT)
label.pack()
b1=ttk.Button(popup,text="OKAY",command=popup.destroy)
b1.pack()
popup.mainloop()
class MainWindow(tk.Tk):
def __init__(self,*arg,**kwargs):
tk.Tk.__init__(self,*arg,**kwargs)
container=tk.Frame(self)
container.pack(side="top",fill="both",expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
menubar=tk.Menu(container)
filemenu=tk.Menu(menubar,tearoff=0)
filemenu.add_command(label="Save settings", command=lambda:popupmsg("Not supported yet!"))
filemenu.add_command(label="Exit",command=quit)
menubar.add_cascade(label="File", menu=filemenu)
tk.Tk.config(self,menu=menubar)
self.frames={}
for F in(StartPage,PageOne):
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(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
label_startpage=ttk.Label(self,text="Start Page",font=LARGE_FONT)
label_startpage.pack(padx=10,pady=10)
button_to_pageONE=ttk.Button(self,text="Go to Page ONE",command= lambda:
controller.show_frame(PageOne)).pack()
class PageOne(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
self.rowconfigure(0, minsize=200, weight=1)
self.columnconfigure(1, minsize=200, weight=1)
txt_edit = tk.Text(self).grid(row=0, column=1, sticky="nsew")
button_frame = tk.Frame(self,bg="lightblue").grid(row=0, column=0, sticky="ns")
btn_open = ttk.Button(button_frame, text="Open").grid(row=0, column=0, sticky="ew", padx=5, pady=5)
btn_save = ttk.Button(button_frame, text="Save As...").grid(row=1, column=0, sticky="ew", padx=5)
button_to_startpage = ttk.Button(button_frame, text="Back to Start Page",
command=lambda:
controller.show_frame(StartPage)).grid(row=2, column=0,
sticky="ew", padx=5,
pady=5)
app=MainWindow()
app.geometry("1280x720")
app.mainloop()
您不能在容器上使用pack和grid
container=tk.Frame(self)
container.pack(side="top",fill="both",expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
包装和网格不能很好地协同工作。
有关更多信息,请参见您在这一行中犯了一个非常常见的错误:
button_frame = tk.Frame(self,bg="lightblue").grid(row=0, column=0, sticky="ns")
由于您正在执行tk.Frame(…).grid(…)
,按钮_Frame
被设置为.grid(…)
的结果。这使得按钮成为框架
无
。当您执行btn\u open=ttk.Button(Button\u frame,…)
时,会将按钮放置为根窗口的子窗口,而不是Button\u frame的子窗口。您正在根窗口中使用pack
,因此无法对根窗口中的任何其他小部件使用grid
解决方案是通过将小部件创建与小部件布局分离,正确创建按钮框架
:
button_frame = tk.Frame(...)
button_frame.grid(...)
虽然确实不能在具有相同父级的小部件上使用pack和grid,但您发布的代码并不是这样做的。它使用pack
将容器放置在其父容器中,但是grid\u row configure
和grid\u column configure
仅影响容器的子容器,这是完全可以接受的。