Как заставить мое приложение Tkinter поместиться во все окно независимо от его размера?

Я создал приложение Tkinter, используя Python. Я хочу, чтобы его размер автоматически изменялся и заполнялся всем окном независимо от того, как я его изменяю. Проблема в том, что когда я увеличиваю размер окна (с помощью курсора), на границах появляется серое пространство, заполняющее пробелы (см. изображение ниже).

Заполнение серого пространства

Вот код без ненужных деталей:

import tkinter as tk
from tkinter import ttk
import openpyxl


root = tk.Tk()

frame = ttk.Frame(root)
frame.pack()

widgets_frame = ttk.LabelFrame(frame, text = "Insert Data")
widgets_frame.grid(row = 0, column = 0, padx = 20, pady = 10)

day_label = ttk.Label(widgets_frame, text = "Date")
day_label.grid(row = 1, column = 0, padx = 5, pady = (0, 5), sticky = "ew")
day_entry = ttk.Entry(widgets_frame)
day_entry.grid(row = 2, column = 0, padx = 5, pady = (0, 5), sticky = "ew") 

walking_entry = ttk.Entry(widgets_frame)
walking_entry.insert(0, "Walking duration (min)")
walking_entry.bind("<FocusIn>", lambda e: walking_entry.delete('0', 'end'))
walking_entry.grid(row = 3, column = 0, padx = 5, pady = (0, 5), sticky = "ew")

button = ttk.Button(widgets_frame, text = "Insert")
button.grid(row = 4, column = 0, padx = 5, pady = 5, sticky = "nsew")

treeFrame = ttk.Frame(frame)
treeFrame.grid(row = 0, column = 1, pady = 10)
treeScroll = ttk.Scrollbar(treeFrame)
treeScroll.pack(side = "right", fill = "y")

cols = ("Day", "Walking")

treeview = ttk.Treeview(treeFrame, show = "headings", yscrollcommand = treeScroll.set, columns = cols, height = 13)
treeview.column("Day", width = 100)
treeview.column("Walking", width = 50)
treeview.pack()
treeScroll.config(command = treeview.yview)

root.mainloop()

Есть ли у кого-нибудь предложение, которое поможет мне решить эту проблему? Спасибо.

Я добавил эту строку кода, потому что в другой теме они сказали, что это помогает равномерно расширять виджеты при увеличении размера окна:

root.grid_columnconfigure(0,weight = 1)
root.grid_columnconfigure(1,weight = 1)
root.grid_rowconfigure(0, weight = 1)
root.grid_rowconfigure(1, weight = 1)
root.grid_rowconfigure(2, weight = 1)
root.grid_rowconfigure(3, weight = 1)
root.grid_rowconfigure(4, weight = 1)

К сожалению, даже после этого я не заметил никаких изменений.

Вам нужно применить rowconfigure и columnconfigure ко всем контейнерам (frame и widget_frame)

Derek 28.04.2024 02:22

Непонятно, какой конечный результат вы хотите получить при изменении размера окна. Должен ли расширяться только виджет древовидного представления, чтобы заполнить доступное пространство?

acw1668 30.04.2024 09:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать expand = True, fill = BOTH в качестве атрибута необходимых виджетов, чтобы развернуть их до полного размера.

Вот решения, которые я применил к вашему примеру кода.

Интересно, что разные менеджеры работают вместе!

Возникли проблемы с сеткой sticky и упаковкой.

Плюс необходимость использовать rowconfigure and columnconfigure на frame вместо root.

Вот подборка значений frame.columnconfigure, которые изменят поведение виджетов внутри.

if False:
    frame.columnconfigure(0, weight=1) # left widget expand (Entries)
elif True:
    frame.columnconfigure(1, weight=1) # right widget expand (Treeview)
else:
    frame.columnconfigure((0,1), weight=1) # both widgets expanded

Я сохранила pack и grid менеджеров, так как они все работают вместе!

import tkinter as tk
from tkinter import ttk
import openpyxl

root=tk.Tk()
frame=ttk.Frame(root)
frame.pack(side = "top", fill = "both", expand = "y") # expanded
# Required
frame.rowconfigure(0, weight=1)
frame.columnconfigure((0,1), weight=1) # expand both widgets in frame

widgets_frame=ttk.LabelFrame(frame, text = "Insert Data")
widgets_frame.grid(row=0, column=0, padx=20, pady=10, sticky = "nsew") # expanded
# Required
widgets_frame.rowconfigure(0, weight=1)
widgets_frame.columnconfigure(0, weight=1)

day_label=ttk.Label(widgets_frame, text = "Date")
day_label.grid(row=1, column=0, padx=5, pady=(0, 5), sticky = "ew")
day_entry=ttk.Entry(widgets_frame)
day_entry.grid(row=2, column=0, padx=5, pady=(0, 5), sticky = "ew") 

walking_entry=ttk.Entry(widgets_frame)
walking_entry.insert(0, "Walking duration (min)")
walking_entry.bind("<FocusIn>", lambda e: walking_entry.delete("0", "end"))
walking_entry.grid(row=3, column=0, padx=5, pady=(0, 5), sticky = "ew")

button=ttk.Button(widgets_frame, text = "Insert")
button.grid(row=4, column=0, padx=5, pady=5, sticky = "nsew")

treeFrame=ttk.Frame(frame)
treeFrame.grid(row=0, column=1, pady=10, sticky = "nsew") # expanded

treeScroll=ttk.Scrollbar(treeFrame)
treeScroll.pack(side = "right", fill = "y")

cols=("Day", "Walking")

treeview=ttk.Treeview(treeFrame, show = "headings", yscrollcommand=treeScroll.set, columns=cols, height=13)

treeview.column("Day", width=100)
treeview.column("Walking", width=50)
treeview.pack(side = "top", fill = "both", expand = "y") # expanded
treeScroll.config(command=treeview.yview)

root.mainloop()

Другие вопросы по теме