Как изменить размер фрейма в Tcl / Tk

#tcl #tk

#tcl #tk

Вопрос:

Как мне отключить фрейм в Tcl / Tk

Я пробовал:

 ttk::frame .container;
wm resizable .container 0 0
 

но это не работает. В нем говорится, что это не контейнер верхнего уровня. И когда я попробовал то же самое, используя:

 toplevel .container
wm resizable .container 0 0
 

Это сработало. Но это не то, чего я хочу. Я хотел бы отключить фрейм, который не является контейнером верхнего уровня.

Комментарии:

1. Вы хотите изменить размер или отключить фрейм?

2. @luchosrock Я хочу, чтобы кнопка «Развернуть» фрейма была отключена

3. Есть ли причина, по которой вы хотите, чтобы он был отключен? И не могли бы вы поместить ссылку на изображение вашего «фрейма», потому что у меня нет кнопки «Развернуть» на фрейме, когда я его создаю.

4. «Отключить фрейм» не имеет смысла. Фреймы не могут быть включены или отключены. Либо они существуют, либо их нет. Вы хотите отключить все виджеты внутри фрейма?

Ответ №1:

tl; dr Вы не можете сделать это таким образом. Попробуйте place и поймите, что делает отключение распространения в pack и. grid


Размер (и положение) каждого виджета полностью зависит от его контейнера. Для виджетов верхнего уровня контейнер (фактически) является оконным менеджером, и wm команда делает вежливые запросы к оконному менеджеру для чего-либо (это также означает, что это применимо только к виджетам верхнего уровня и, вероятно, должно было быть сделано с помощью опций на toplevel , но это лодка, которая была упущена десятилетия назад).

Для не-верхних уровней Tk контролирует и делает это через свою систему geometry Manager (в отличие от некоторых наборов инструментов, Tk не привязывает строго каждый виджет к использованию одного geometry manager). Менеджеры pack и grid geometry очень заинтересованы в изменении размеров виджетов, чтобы попытаться создать то, что обычно является приятным расположением, в соответствии с инструкциями, которые им были даны; каждый из них позволяет отключить распространение (это может оказаться актуальным, если вы помещаете содержимое во фрейм), что означает, что они прекращают изменять размер мастер в ответ на запрос изменяет размер дочерних элементов, но они все равно меняют размеры дочерних элементов.

Однако менеджер place геометрии может делать то, что вам нужно. С place помощью вы точно контролируете, что происходит, напрямую указывая, каковы местоположения и размеры. Действительно, если вы хотите делать такие вещи, как распространение, вы должны сами устанавливать <Configure> события, чтобы определить тот факт, что изменения должны произойти, и вам в значительной степени придется выполнять всю логику самостоятельно. Для виджета, размер которого не изменяется, просто оставьте ширину и высоту неуказанными при настройке place виджета, и все должно быть в порядке.

 ttk::frame .f -width 15 -height 18
place .f -x 30 -y 45
 

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

Ответ №2:

Попробуйте это:

Сначала создайте окно верхнего уровня…

 % set tl [toplevel .someNameOrOther]
 

… и фрейм на этом верхнем уровне…

 % set frm [ttk::frame $tl.myFrame]
 

… Затем упакуйте фрейм в контейнер верхнего уровня…

 % pack $frm -expand yes -fill both
 

… Установите для контейнера верхнего уровня не изменяемый размер

 % wm resizable $tl 0 0
 

…и все готово. Кнопка развернуть на контейнере верхнего уровня, в котором хранится ваш фрейм, выделена серым цветом.

Это должно работать независимо от того, используете ли вы старый стиль frame или более новый ttk::frame , и какой бы менеджер геометрии вы ни использовали для верхнего уровня — grid или pack как указано выше.

Отредактировано, чтобы исправить опечатки, на которые указал Hoodiecrow