Как установить столбцы и строки размером окна в рамке tkinter?

#python-3.x #tkinter #tkinter-layout

Вопрос:

Поэтому я ищу способ, чтобы мои столбцы и строки кнопок занимали все доступное место на «начальной странице». Я огляделся вокруг, и все, что я могу найти, — это способы сделать это не в тз.Кадр с использованием columnconfigure, но это, похоже, не работает при использовании его в качестве кадра, так как я получаю «AttributeError: объект» функция «не имеет атрибута «rowconfigure «» при запуске кода. Это мой код:

 import tkinter as tk import time import tkinter.font as tkFont import time import os from tkinter import * class App(tk.Tk):  def __init__(self):  tk.Tk.__init__(self)  self._frame = None  self.switch_frame(StartPage)   def switch_frame(self, frame_class):  """Destroys current frame and replaces it with a new one."""  new_frame = frame_class(self)  if self._frame is not None:  self._frame.destroy()  self._frame = new_frame  self._frame.pack()   class StartPage(tk.Frame):  def __init__(self, master):  tk.Frame.__init__(self, master)  def admin_pass_check():  global top  top= Toplevel(app)  top.geometry("200x100")  label = Label(top,text="Input Password")  label.pack()  password = Entry(top,show="*",width=20)  password.pack()  def check():  global valid  pswd = password.get()  if pswd == "yes":  valid = True  top.destroy()  else:  valid = False  button= Button(top, text="Submit", command=check)  button.pack(pady=5, side= TOP)  def final_check():  admin_pass_check()  app.wait_window(top)  if not valid == None:  if valid == True:  print("Password Was Correct")  master.switch_frame(Admin)   frame = tk.Frame(self)## This is the bit I need help with  self.grid_columnconfigure(0, weight=1)##    label = tk.Label(self, text="This is the start page")  user = tk.Button(self, text="User", command=lambda: master.switch_frame(User))  admin = tk.Button(self, text="Admin", command=final_check)  label.grid(row=0,column=0,sticky="NSEW")  user.grid(row=1,column=0,sticky="NSEW")  admin.grid(row=2,column=0,sticky="NSEW")  class User(tk.Frame):  def __init__(self, master):  tk.Frame.__init__(self, master)  self.master = master  self.pack(fill=BOTH, expand=1)   page_1_label = tk.Label(self, text="This is page one")  start_button = tk.Button(self, text="Return to start page", command=lambda: master.switch_frame(StartPage))  page_1_label.pack(side="top", fill="x", pady=10)  start_button.pack()   class Admin(tk.Frame):  def __init__(self, master):  tk.Frame.__init__(self, master)   page_2_label = tk.Label(self, text="This is page two")  start_button = tk.Button(self, text="Return to start page", command=lambda: master.switch_frame(StartPage))  page_2_label.grid(row=0,column=0,sticky="NSEW")  start_button.grid(row=1,column=0,sticky="NSEW")  start_button.grid()    app = App()  app.geometry("500x500") app.mainloop()  

Ответ №1:

Это происходит потому, что рамка StartPage не заполняет пространство своего родителя. Вам нужно добавить fill='both', expand=1 , когда вы звоните pack() по нему:

 class App(tk.Tk):  def __init__(self):  tk.Tk.__init__(self)  self._frame = None  self.switch_frame(StartPage)   def switch_frame(self, frame_class):  """Destroys current frame and replaces it with a new one."""  new_frame = frame_class(self)  if self._frame is not None:  self._frame.destroy()  self._frame = new_frame  self._frame.pack(fill='both', expand=1) # use all space of parent  

Обратите также внимание, что вам не нужно звонить self.pack(fill=BOTH, expand=1) внутрь User.__init__() .