Я нахожусь в ситуации, когда я должен использовать только .pack()
или .grid()
для достижения заданных размеров виджетов, когда они располагаются рядом друг с другом.
Раньше я смешивал .pack()
с.grid()
на основе знаний, полученных в этом посте:
В каких случаях сетка Tkinter () не может быть смешана с pack ()?
, т. Е. С упакованными кадрамирядом друг с другом, но внутри каждого кадра у меня есть сетки.Он работал нормально, пока я не обновил бэкэнд Tcl / TK до 8.6.8 в официальном Python 3.7.2, когда я начал видеть проблемы с интерпретатором:
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack
Затем я переключил все на .pack()
, но теперь у меня возникли проблемы с возвратом дизайнов моих колонок, в которых некоторые виджеты шире других.
Должен ли я сделать все .grid()
для достижения этого или есть секретные ингредиенты в .pack()
, которые я не сделалне видите в документах?
В идеале я ожидаю достичь следующего
- В ряду виджетов виджеты располагаются рядом друг с другом и максимально заполняют пространство, аналогично
.pack(side='left', fill='x', expand=True)
- В той же строке я все еще могу указать один виджет, который будет шире, чем остальные, так что при установке всего на
expand=True
относительные размеры все еще контролируются.
Пример
В macOS следующий код дает мне более широкий ввод и более узкий ползунок, в то время как я хотел бы наоборот, просто .pack()
.
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
mainframe = tk.Frame(root, bg='blue')
mainframe.pack()
row1 = tk.Frame(mainframe, bg='red')
entry = ttk.Entry(row1, text='Search...')
slider = ttk.Scale(row1)
btn1 = ttk.Button(row1, text='Reset')
btn2 = ttk.Button(row1, text='Help')
entry.pack(side='left', fill='x', expand=True)
slider.pack(side='left', fill='x', expand=True)
btn1.pack(side='left', fill='x', expand=True)
btn2.pack(side='left', fill='x', expand=True)
row1.pack()
root.mainloop()
Я должен подчеркнуть, что я знаю, как использовать .grid()
с моими "строками", используя .grid_columnconfigure(col, weight)
, что сработало.Это просто мой рабочий код (конечно, более сложный, чем в приведенном выше примере), который просто сломался после обновления до TK 8.6, что означает, что по мере того, как мой проект становится больше, поддерживать смешанных менеджеров будет все труднее.Поэтому я решил выбрать лагерь между .pack()
и .grid()
.Если один может достичь всего, что другой может заплатить, это было бы здорово.