Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在添加框架来组织我的程序时没有什么困难_Python_Tkinter - Fatal编程技术网

Python 在添加框架来组织我的程序时没有什么困难

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

我在Tkinter文本编辑器应用程序中使用此代码在帧之间导航。当我想用多个框架组织pageone以收集同一框架中的所有按钮和其他可能框架中的其他小部件时,我遇到了一个错误:\u tkinter.TclError:无法在内部使用geometry manager网格。它已经有了由pack管理的奴隶。如果你能帮我,泰

这是我使用的代码

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
仅影响容器的子容器,这是完全可以接受的。