如何启用 .grid?

How do I enable .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, *args, **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, height=10, font=30, bg='powder blue')
        button1.pack(pady=10)
        button2.pack(pady=10)


class AdminLogin(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", side ="top", expand=True)
        label = tk.Label(frame, text="Enter username and password to login", font=controller.title_font)
        label.pack(side="top", fill="x", 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, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        frame = tk.Frame(self, width = 1024, height = 768, bg='teal')
        frame.pack(fill="both", side ="top", expand=True)
        label = tk.Label(frame, text="Enter username and password to login", font=controller.title_font)
        label.pack(side="top", fill="x", pady=30, padx =10)
        button = tk.Button(frame, text="Back",
                           command=lambda: controller.show_frame("StartPage"), bg='powder blue')
        button.pack()


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


    app.mainloop()

遗憾的是,您不能混合使用 pack 和 grid 方法。您只需选择一个,您将在整个母版中使用它。 Pack 更易于使用,但有了网格,您可以更好地控制小部件在 window 中的显示位置。 (我会这样做作为对您 post 的评论,而不是答案,但我没有足够的声誉来这样做)我希望这会有所帮助:)