Изменение размера списка таблиц

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

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


person L. Alejandro M.    schedule 23.10.2011    source источник


Ответы (1)


Все виджеты 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 в остальной части вашего графического интерфейса (ваша кнопка для переключения отображения второго списка таблиц и т. д.)

person Donal Fellows    schedule 25.10.2011
comment
Прежде чем кто-нибудь спросит, это невозможно сделать с помощью pack самостоятельно, поскольку у него неправильная стратегия обработки сжатия виджета, и хотя grid может делать это с правильными ограничениями, ему это совсем не нравится (я пытался, и как только я удалил ограничение, которое я установил с помощью wm maxsize, все снова изменило размер; это может быть поведение, зависящее от платформы, но это нежелательно). Относительно редкий place GM как раз подходит для этой задачи, но нуждается в привязке <Configure>. - person Donal Fellows; 25.10.2011