Менеджер геометрии сетки не будет центрировать кадр в середине окна - PullRequest
1 голос
/ 13 мая 2019

Я начал разрабатывать некоторые графические интерфейсы на python не так давно и наконец решил, что знаю достаточно, чтобы написать полный графический интерфейс с менеджером геометрии сетки. Я был удивлен, увидев, что при попытке расширить рамку сетки до краев окна с помощью аргумента sticky="nsew" это не сработало, и все элементы сетки остались в левом верхнем углу экрана. .

Вы можете проверить мой код и некоторые скриншоты ниже.

Чтобы решить эту проблему, я пробовал различные решения, включая удаление аргумента sticky (строка 7), однако это портит цвет фона, и рамка не распространяется на края окна. Как я могу исправить эту проблему и заставить рамку расширяться до границ окна? Заранее спасибо! (;

Использование класса GridPage - not centerd!
placed using grid

с использованием класса PackPage и функции .pack() - centerd, как мне нужно
placed using grid

Вот мой код для второго примера:

import tkinter as tk

class DefaultPage(tk.Frame):

    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.grid(row=0, column=0, sticky="nsew")


class GridPage(DefaultPage):

    def __init__(self, *args, **kwargs):
        DefaultPage.__init__(self, *args, **kwargs)

        tk.Button(self, text='hello!').grid()
        tk.Label(self, text="I'm placed USING GRID").grid()


class PackPage(DefaultPage):

    def __init__(self, *args, **kwargs):
        DefaultPage.__init__(self, *args, **kwargs)

        tk.Button(self, text='hi there!').pack()
        tk.Label(self, text="I'm placed USING PACK").pack()


root = tk.Tk()

baseframe = tk.Frame(root)
baseframe.pack(side="top", fill="both", expand=True)
baseframe.grid_rowconfigure(0, weight=1)
baseframe.grid_columnconfigure(0, weight=1)

# frame = PackPage(baseframe, bg='yellow')  # second screenshot. works as intended
frame = GridPage(baseframe, bg='yellow')  # not centerd in the middle of the window.

root.mainloop()

1 Ответ

2 голосов
/ 13 мая 2019

Вам необходимо настроить вес для строк и столбцов. По умолчанию weights = 0, что означает, что виджет внутри фрейма всегда будет уменьшаться до минимально возможного размера. Так что вам нужно настроить это.

Это достигается с помощью этих функций grid_rowconfigure() и grid_rowconfigure()

Что нужно сделать здесь, так как кажется, чтобы вес столбца = 1 расширялся вместе с контейнером, при этом вес 1-го ряда = 0, чтобы метка и кнопка всегда были прикреплены.

Ваш код будет таким

class DefaultPage(tk.Frame):

    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.grid(row=0, column=0, sticky="nsew")
        self.grid_rowconfigure(0, weight=0)
        self.grid_columnconfigure(0, weight=1)


class GridPage(DefaultPage):

    def __init__(self, *args, **kwargs):
        DefaultPage.__init__(self, *args, **kwargs)

        tk.Button(self, text='hello!').grid(sticky="n")
        tk.Label(self, text="I'm placed USING GRID").grid(sticky="n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...