Когда я вижу виджеты, которые занимают всю ширину или полную высоту области, я обычно использую pack
, так как он специально предназначен для размещения объектов вдоль стороны пустой полости. Вы можете использовать grid
, но это требует дополнительного кода, так как вам нужно добавить виджет и настроить строки и столбцы. С pack
все, что вам нужно сделать, это добавить виджеты.
Например, ясно, что вам нужна строка состояния внизу, панель инструментов для времени и промежуточный виджет. Итак, начнем с этого, как в следующем примере:
import tkinter as tk
root = tk.Tk()
root.geometry("600x400")
toolbar = tk.Frame(root, background="#d5e8d4", height=40)
statusbar = tk.Frame(root, background="#e3e3e3", height=20)
main = tk.PanedWindow(root, background="#99fb99")
toolbar.pack(side="top", fill="x")
statusbar.pack(side="bottom", fill="x")
main.pack(side="top", fill="both", expand=True)
root.mainloop()
Примечание: ширины, высоты и цвета добавляются в кадр в иллюстративных целях, так как в противном случае пустой кадр будет иметь размер 1x1. Как только вы добавите виджеты внутри рамки, вы можете удалить опции width
и height
.
![screenshot of main layout](https://i.stack.imgur.com/Ucthm.png)
Вы говорите, что справа будет окно с панорамированием , так что добавьте это справа. Мы будем использовать обычный кадр слева.
left_pane = tk.Frame(main, background="#99fb99", width=100)
right_pane = tk.PanedWindow(main, background="#99fb99", width=200)
main.add(left_pane)
main.add(right_pane)
![screenshot with left/right panes](https://i.stack.imgur.com/8zUPz.png)
Затем добавьте две панели справа. Чтобы я мог отображать цвета с как можно меньшим количеством кода, я буду использовать рамку сверху вместо ноутбука:
notebook = tk.Frame(right_pane, background="#99ceff", height=70)
bottom_right = tk.Frame(right_pane, background="#ffe6cd", height=50)
right_pane.add(notebook)
right_pane.add(bottom_right)
![final screenshot](https://i.stack.imgur.com/t89Il.png)
С учетом всего сказанного, вы можете использовать grid
, если хотите. Хитрость заключается в том, чтобы использовать промежуточные кадры, поскольку компоновка в любом виджете не зависит от компоновки в родительских или дочерних виджетах.
Все, что вам нужно сделать, - это удалить первые три вызова на pack
и заменить его следующими пятью строками:
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
toolbar.grid(row=0, column=0, sticky="ew")
main.grid(row=1, column=0, sticky="nsew")
statusbar.grid(row=2, column=0, sticky="ew")
Поскольку остальные виджеты являются потомками панорамированных виджетов, в этом нет ничего еще сделать. Любые виджеты, которые вы добавляете на каждую панель, имеют собственную независимую область макета, поэтому вы можете использовать grid
, pack
или place
внутри каждого кадра.
Чтобы проиллюстрировать эту точку, я буду использовать grid
добавить несколько строк и столбцов квадратов:
for row in range(6):
for column in range(30):
f = tk.Frame(bottom_right, background="white",
bd=2, relief="raised", width=10, height=10)
f.grid(row=row, column=column)
![screenshot with squares](https://i.stack.imgur.com/krAHd.png)