Использование диспетчера геометрии сетки не будет центрировать рамку в середине окна

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

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

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

Использование класса GridPage - не централизовано!
размещены с использованием сетки

используя класс PackPage и .pack() - по центру, как мне нужно
размещены с использованием сетки

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

 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 ответ


Вам необходимо настроить вес для строк и столбцов. По умолчанию 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")

Есть идеи?

10000