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






Вы можете использовать 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()
Вам нужно применить
rowconfigureиcolumnconfigureко всем контейнерам (frame и widget_frame)