Tkinter: Почему добавление метки горизонтально расширяет фрейм? [Дубликат]

EDIT: Я идиот. Я пропустил тот факт, что это список для копирования на запись, поэтому каждое удаление означает новую копию . Поэтому мои предложения ниже могут быть субоптимальными, если есть несколько удалений.

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

  1. Уменьшить индекс после удаления чего-либо (старайтесь не делать ничего с индексом до следующей итерации). Для этого вам, очевидно, придется использовать стиль for (int i = 0; i & lt; ... style for for), чтобы вы могли манипулировать индексом.
  2. Как бы то ни было, повторите то, что делает внутренняя часть цикла, буквально вернувшись к вершине цикла. Немного взлома - я бы избегал этой техники.
  3. Итерации по списку в обратном порядке (от конца до start, а не от начала до конца). Я предпочитаю этот подход, поскольку он самый простой.
32
задан nbro 21 March 2015 в 04:57
поделиться

1 ответ

По умолчанию tk frames сжимаются или растут, чтобы соответствовать их содержимому , чего вы хотите в 99% случаев. Термин, описывающий эту функцию, - «распространение геометрии». Существует команда , чтобы включить или отключить распространение геометрии при использовании pack аналогичного для grid).

Поскольку вы используете пакет, синтаксис будет выглядеть следующим образом:

f.pack_propagate(0)

или, возможно, root.pack_propagate(0), в зависимости от того, какие виджеты вы действительно хотите повлиять.

Как сказано, подавляющее большинство времени вы должны позволить tkinter вычислить размер. Когда вы поворачиваете распространение геометрии, ваш графический интерфейс не будет хорошо реагировать на изменения разрешения, изменения в шрифтах и ​​т. Д. Менеджеры геометрии tkinter (pack, place и grid) являются чрезвычайно мощными. Научитесь использовать эту власть.

46
ответ дан Bryan Oakley 16 August 2018 в 04:46
поделиться
  • 1
    Это также может быть self.pack_propagate(0), если сделано в методе, подобном __init__() класса виджета, полученного из Frame - как в обычно используемой class Application(Frame): идиоме. – martineau 30 September 2012 в 20:09
  • 2
    Первый пример не работает для меня. Окно имеет нужный размер, но виджеты не видны на экране. Второй пример действительно работает для меня, все отображает тонкий экран с заданной шириной / высотой! +1 – Bas 26 May 2015 в 19:30
  • 3
    @Bas: в исходном примере высота кадра & quot; не передается и по умолчанию 0, поэтому, когда распространение отключено, высота остается 0, и вы не видите метку. Вам нужно будет установить высоту кадра = 20 или что-то вдоль этих линий, чтобы увидеть метку. – Gary02127 22 October 2017 в 20:19
Другие вопросы по тегам:

Похожие вопросы: