Tkinter. Какой метод позиционирование лучше выбрать .pack / .place / .grid?

У меня есть две кнопки. Как мне можно их разместить по середине оси 'Y' и при этом чтобы они были прижаты к верхнему краю? Также важный аспект: по функции эти две кнопки должны добавлять элементы над собой - формы. После нажатия на одну из этих кнопок - над ними должен появляется новый виджет, а кнопки при этом должны опускаются вниз, но оставаться по центру и прижатыми к нижнему краю этого виджета.

import customtkinter as ctk
from PIL import Image, ImageTk

app = ctk.CTk()

main_frame = ctk.CTkScrollableFrame(app, corner_radius=0, fg_color='#494949')
main_frame.pack(fill='both', expand=True)

add_btns_frame = ctk.CTkFrame(main_frame, corner_radius=0, fg_color='#494949')
add_btns_frame.pack(fill='x', pady=10, side='top')

add_template_btn = ctk.CTkButton(add_btns_frame, text='Te', fg_color='#524F4F', hover_color='#716C6C',
                                 height=30, width=30, corner_radius=0, border_width=2, border_color='#393939')
add_template_btn.pack(side='left')

add_divider_image = ctk.CTkImage(Image.open('images/divider.png').resize((30, 30)))
add_divider_btn = ctk.CTkButton(add_btns_frame, text='', fg_color='#524F4F', hover_color='#716C6C',
                                height=30, width=30, corner_radius=0, border_width=2, border_color='#393939',
                                image=add_divider_image)
add_divider_btn.pack(side='left')


Что я имею сейчас:
66369ce286bb9472563577.png

К чему я стремлюсь:
66369e568b278726159859.png
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Помести кнопки в Frame, Frame прикрути через pack(). Кнопки внутри фрейма - можно тоже через pack, можно еще как.
Единственное, при добавлении новых элементов нужно будет сообразить, как указать, чтобы они паковались ДО фрейма с кнопками.

EDIT: Заверни панель кнопок в ещё один Frame, и помести эту панель внутри внешнего Frame через pack(side='top', anchor='center'). Но учитывая, что у тебя в окне и так уже используется pack(side='top'), то можно обойтись без внешнего Frame - просто убери expand/fill с панели кнопок и запакуй её наверх.
Пример кода с внешней панелью:
import tkinter as tk


root = tk.Tk()
root.geometry('200x100')
frame_outer = tk.Frame(root, bg='blue')
frame_outer.pack(expand=True, fill='both')

frame = tk.Frame(frame_outer, bg='green')
btn1 = tk.Button(frame, text='Button1')
btn2 = tk.Button(frame, text='Button2')
btn1.pack(side='left', padx=5, pady=5)
btn2.pack(side='left', padx=5, pady=5)
frame.pack(side='top', anchor='center')

root.mainloop()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы