如何启用.grid?

问题描述

我想放置用户名和密码,使其彼此相邻。为了实现这一点,我使用了grid方法,但不断收到错误消息:

_tkinter.TclError: cannot use geometry manager grid inside .!frame.!adminlogin.!frame which already has slaves managed by pack

有没有办法让它甚至可以使用grid

import tkinter as tk
from tkinter import font as tkfont
import PIL.Image
from PIL import ImageTk
from tkinter import *
import tkinter.font as font
import sqlite3,hashlib
from datetime import date


class SampleApp(tk.Tk):

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

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

        # the container is where we'll stack a bunch of frames
        # on top of each other,then the one we want visible
        # will be raised above the others
        self.geometry ("1024x768")
        container = tk.Frame(self)

        container.pack(fill="both",side= 'top',expand=True)

        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        self.frames = {}
        for F in (StartPage,StudentLogin,AdminLogin):
            page_name = F.__name__
            frame = F(parent=container,controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            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
        frame = tk.Frame(self,width = 1024,height = 768,bg="teal")

        frame.pack(fill="both",expand=True,side="top")
        label = tk.Label(frame,text="WELCOME",font=controller.title_font)
        label.pack(side="top",fill="x",pady=50)

        button1 = tk.Button(frame,text="Admin Login",command=lambda: controller.show_frame("AdminLogin"),width = 50,height=10,font=30,bg='powder blue')
        button2 = tk.Button(frame,text="Student Login",command=lambda: controller.show_frame("StudentLogin"),width=50,bg='powder blue')
        button1.pack(pady=10)
        button2.pack(pady=10)


class AdminLogin(tk.Frame):

    def __init__(self,parent)
        self.controller = controller
        frame = tk.Frame(self,bg='teal')
        frame.pack(fill="both",side ="top",expand=True)
        label = tk.Label(frame,text="Enter username and password to login",pady=30,padx =10)
        userLabel = tk.Label(frame,text = "Enter Username: ",font=50)

        userLabel.pack(padx=10,pady=10)
        userEntry = tk.Entry(frame)
        userEntry.pack(padx=10,pady=10)

        passwordL = tk.Label(frame,text = "Enter Password: ",font=50)
        passwordL.pack(padx=10,pady=10)
        passEntry = tk.Entry(frame,show="*")
        passEntry.pack(padx=10,pady=10)
        button = tk.Button(frame,text="Back",command=lambda: controller.show_frame("StartPage"),bg='powder blue')
        button.pack()


class StudentLogin(tk.Frame):

    def __init__(self,padx =10)
        button = tk.Button(frame,bg='powder blue')
        button.pack()


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


    app.mainloop()

解决方法

不幸的是,您不能同时使用pack方法和grid方法。您只需要选择一个即可在整个母版中使用。 Pack易于使用,但是通过网格,您可以更好地控制窗口小部件在窗口中的显示位置。 (我本来是对您的帖子的评论,而不是回答,但我没有足够的声誉来做到这一点),希望对您有所帮助:)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...