Может ли кто-нибудь помочь мне заставить мою вложенную рамку заполнить оставшееся пространство окна, находясь внутри ячейки его родителя?Я создал окно приложения, дал ему контейнер, дал контейнеру 2 строки и динамические столбцы в зависимости от количества страниц.Мой контейнер является родителем.Мне удалось заполнить окно родительской ячейкой, указав вес 1 во второй строке и расширив 1-й столбец до всех доступных столбцов.Затем я вставил рамку гнезда (это страницы) во второй ряд под кнопками для каждой страницы в первом ряду.Однако мне кажется, что у меня проблемы с иерархией пакетов и сетки, даже когда я удаляю все виды использования сетки.Это похоже на то, что tk.Tk () автоматически контролируется сеткой при вызове.
Строка 41, кажется, является местом, где я мог бы заполнить пачку и развернуть ее на странице.Но это вызывает ошибку иерархии, даже после удаления всего использования сетки и замены необходимых пакетов.Он работает без этой строки, используя сетку.Просто не в состоянии заполнить / развернуть
import tkinter as tk
from tkinter import font as tkfont
class Application(tk.Tk):
def __init__(self, title, page_list):
tk.Tk.__init__(self)
self.minsize(500, 500)
self.maxsize(500, 500)
self.update_idletasks()
self.title_font = tkfont.Font(family="Helvetica", size=10, weight="bold", slant="italic")
self.title(title)
# Create the main container. Row 1 holds page buttons. Row 2 is for the page frame.
container = tk.Frame(self)
container.configure(bg="red")
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(1, weight=1)
container.grid_columnconfigure(len(page_list), weight=1)
# Begin making the pages and put them in a dictionary to grab by name.
self.pages = {}
self.p_names = page_list
for P in self.p_names:
page_name = P.__name__
page = P(parent=container, controller=self, title=page_name.strip("Page"))
self.pages[page_name] = page
# Make the buttons from the page list provided
self.create_buttons(container, self)
self.show_page(str(self.p_names[0].__name__), self.currentPage)
def show_page(self, page_name, button):
self.currentPage.configure(relief="raised", bg="red", fg="black")
page = self.pages[page_name]
# Put the page in row 1 below the buttons, in the top left. Expand it so it fills the remainder of the cell/window
#page.pack(side="top", fill="both", expand="true") #This line will cause error when uncommented.
page.grid(row=1, columnspan=len(self.pages), sticky="nw")
for p in self.pages:
if p != page_name:
self.pages[p].grid_forget()
button.configure(relief="sunken", bg="black", fg="white")
self.currentPage = button
def create_buttons(self, s, controller):
pgs = len(self.p_names)*3
# need to figure out how to accurately get window width and use it properly for button width division
pages = {}
for i,p in enumerate(self.p_names):
pages[i] = tk.Button(s, text=p.__name__.strip("Page"), fg="Black", bg="red",
width=(self.winfo_reqwidth() // pgs) + 1,
command=lambda i=i, p=p: controller.show_page(p.__name__, pages[i]))
pages[i].grid(row=0, column=i)
self.currentPage = pages[0]
class NewPage(tk.Frame):
def __init__(self, parent, controller, title):
self.title = title
tk.Frame.__init__(self, parent, bg="Black")
self.controller = controller
# Create Page Title Label
pageTitle = tk.Label(self, text=self.title, font=controller.title_font, bg="Black", fg="white")
# Attempt to fill cell that page is in
pageTitle.pack(fill="both", expand="true")
pageTitle.grid_columnconfigure(1, weight=1)
pageTitle.grid_rowconfigure(1, weight=1)
# Pad the page title
pageTitle.grid(row=0, column=0, pady=10, padx=10, sticky="nsew")
#extraLabel = tk.Label(self, text="test", bg="blue")
#extraLabel.grid(row=1, column=1, pady=5, padx=5, sticky="nsew")
class CharacterPage(NewPage):
def __init__(self, parent, controller, title):
super().__init__(parent, controller, title)
class OptionsPage(NewPage):
def __init__(self, parent, controller, title):
super().__init__(parent, controller, title)
class InventoryPage(NewPage):
def __init__(self, parent, controller, title):
super().__init__(parent, controller, title)
class RandomPage(NewPage):
def __init__(self, parent, controller, title):
super().__init__(parent, controller, title)
def main():
app = Application("Game Title Here", [CharacterPage, InventoryPage, OptionsPage])
app.mainloop()
main()
Что должно произойти, так это страница, потому что ее фон черный, и должен покрывать оставшуюся часть ячейки / окна черным.Раскраска для меня, чтобы визуально видеть, что это работает, а не просто сделать фон черным.Страница в конечном итоге будет заполнена другими элементами.
Я что-то упускаю из-за пакета или сетки?Я довольно новичок в их использовании.Около недели или только 2. Не удалось найти ничего при заполнении вложенной рамки.