tkinter с Tcl / TK 8.6: добиться "ширины столбцов" с помощью pack () - PullRequest
0 голосов
/ 27 декабря 2018

Я нахожусь в ситуации, когда я должен использовать только .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(), которые я не сделалне видите в документах?

В идеале я ожидаю достичь следующего

  1. В ряду виджетов виджеты располагаются рядом друг с другом и максимально заполняют пространство, аналогично .pack(side='left', fill='x', expand=True)
  2. В той же строке я все еще могу указать один виджет, который будет шире, чем остальные, так что при установке всего на 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().Если один может достичь всего, что другой может заплатить, это было бы здорово.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

С pack невозможно, чтобы некоторые виджеты расширялись больше, чем другие.Либо они расширяются, либо нет.Если вы хотите сохранить относительные пропорции, вы должны либо принудительно настроить каждый виджет на определенный размер и развернуть только один виджет, либо вам нужно использовать что-то отличное от pack.

, поскольку неясно, что именно выхотите достичь, и вы утверждаете, что у вас есть рабочее решение с grid, я рекомендую придерживаться сетки.Похоже, что вы уже используете pack для корневого окна.Простое решение - создать фрейм, который можно добавить в корень с помощью pack, а затем поместить виджеты внутри фрейма с помощью grid.

0 голосов
/ 27 декабря 2018

Лично я бы все делал в .grid (), потому что он проще в обслуживании и намного проще, когда все становится сложнее, чем .pack ().Я использовал пакет некоторое время назад, и мне потребовались годы, чтобы сделать что-то, потому что все закончилось тем, что я не хотел их.Подробнее о размерах столбцов в сетке: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/grid-config.html и Tkinter сконфигурируйте ширину столбцов

PS Если вы собираетесь создавать GUI, есть библиотека под названием Kivy, которая отлично подходит для такого рода вещей,просто проверьте это (https://kivy.org/#home), если вам интересно, иначе используйте сетку.

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