#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