Изменение размера списка - PullRequest
1 голос
/ 23 октября 2011

Можно ли изменить размер списка таблиц без воссоздания виджета?

У меня есть два виджета списка таблиц (каждый в виде сетки).Один всегда отображается, другой скрыт, пока вы не нажмете кнопку.Когда отображается второй список таблиц, я хочу изменить размер первого до половины числа строк (из-за удобства чтения с экрана).Затем, если вы закроете второй список таблиц, я вернусь к первому на его первоначальную высоту (начальное количество строк).Как мне этого добиться?(ПРИМЕЧАНИЕ: вопрос в основном о том, возможно ли изменить размер списка nemethi в динамическом режиме.)

1 Ответ

2 голосов
/ 25 октября 2011

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

У вас есть контейнер (верхний уровень или, возможно, фрейм), который будет содержать два виджета списка таблиц (или только один из них, когда должен отображаться только один). Когда добавляется второй список таблиц, мы хотим сохранить размер общего контейнера одинаковым. Самый простой способ сделать это - использовать диспетчер геометрии place - в данном случае, особенно его относительное расположение и элементы управления размерами, - так как это позволяет более точно контролировать размеры виджетов. (Недостатком является то, что у вас есть , чтобы выполнить некоторую работу самостоятельно, чтобы получить правильные начальные размеры виджетов.)

В приведенном ниже коде я предполагаю, что контейнерный виджет называется .container, основной виджет называется .container.main, а дополнительный - .container.extra. Чтобы настроить вещи:

place .container.main
bind .container.main <Configure> {initMainSize %W %w %h}
proc initMainSize {widget width height} {
    # Set up the container preferred size
    [winfo parent $widget] configure -width $width -height $height
    # Install the real placement rules for the main widget
    place configure $widget -relx 0 -rely 0 -relwidth 1 -relheight 1
    # Run this only once, so remove the binding here
    bind $widget <Configure> {}
}

Как добавить .container.extra:

# Extra widget to take bottom half of container; main relegated to top half
place .container.extra -relx 0 -rely 0.5 -relheight 0.5 -relwidth 1
place configure .container.main -relheight 0.5

Как удалить .container.extra:

# Extra widget dropped (but still logically exists); main back to full size
place forget .container.extra
place configure .container.main -relheight 1

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

...