Я начал разрабатывать некоторые графические интерфейсы на 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")