Получение вложенного фрейма для заполнения оставшегося пространства окна в родительской ячейке, которое уже заполняет - PullRequest
0 голосов
/ 13 апреля 2019

Может ли кто-нибудь помочь мне заставить мою вложенную рамку заполнить оставшееся пространство окна, находясь внутри ячейки его родителя?Я создал окно приложения, дал ему контейнер, дал контейнеру 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. Не удалось найти ничего при заполнении вложенной рамки.

1 Ответ

0 голосов
/ 13 апреля 2019

Вы не можете использовать упаковку и сетку в одном контейнере.

Попробуйте придать странице другой цвет bg, чтобы вы могли видеть, когда видите ее:

class NewPage(tk.Frame):
    def __init__(self, parent, controller, title):
        self.title = title
        tk.Frame.__init__(self, parent, bg="tan")    # bg='tan'

вы увидите, что страница находится в левом верхнем углу. Посередине или на странице находится метка pageTitle.

Используйте sticky="nwse", чтобы развернуть страницу и заполнить ячейку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...