Сетки Ткинтер внутри сеток? - PullRequest
0 голосов
/ 08 февраля 2020

Я был бы очень признателен за помощь в выяснении grid менеджера геометрии.

Вот что я хочу построить.

enter image description here

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

Я не уверен, как построить то, что показано на рисунке, используя только сетку, потому что все элементы вложены друг в друга, и каждый элемент должен содержать больше элементов внутри. Не так сложно расположить внешние виджеты с помощью сетки. Я просто помещаю панель инструментов в 0-й ряд, затем крайнюю панель PanedWidow (зеленую) в 1-й ряд, а затем строку состояния во 2-й ряд. После этого мне нужно расположить вещи внутри зеленого PanedWindow. Я помещаю другое PanedWindow (розовое) в правую панель зеленого PanedWindow и затем вставляю Блокнот в его верхнюю панель.

Теперь мне нужно добавить больше виджетов на эти внутренние панели. Например. Я собираюсь добавить несколько кнопок на нижнюю панель розового окна PanedWindow. И вот тут я сталкиваюсь с проблемами.

Если я пытаюсь использовать pack(), чтобы расположить вещи внутри этих самых внутренних панелей, Python кричит на меня за использование более одного менеджера геометрии. Но когда я думаю о том, как это сделать sh с помощью grid, я просто не могу найти способ разделить внутренние панели на более мелкие сетки.

Могут ли быть сетки внутри виджетов, которые были обработаны по внешней сетке?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Когда я вижу виджеты, которые занимают всю ширину или полную высоту области, я обычно использую 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

Вы говорите, что справа будет окно с панорамированием , так что добавьте это справа. Мы будем использовать обычный кадр слева.

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

Затем добавьте две панели справа. Чтобы я мог отображать цвета с как можно меньшим количеством кода, я буду использовать рамку сверху вместо ноутбука:

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

С учетом всего сказанного, вы можете использовать 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

0 голосов
/ 08 февраля 2020

Я нашел пост , которому около двух лет, который может быть немного староват для вашего использования, но он содержит некоторую информацию о вложенных сетках в Tkinter. Он рекомендует использовать фреймы для вложения сеток, по сути, имея детей внутри дочерних элементов фрейма. В этих рамках вы можете размещать объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...