Т.к, как сделать макет с .pack?

Когда я помещаю две кнопки в «верхнюю» часть TkRoot, они располагаются друг под другом. Каковы параметры для «.pack», если они выровнены по горизонтали? (решение также должно применяться для n-кнопок)

Код Ruby был бы отличным, но все, что работает с tk, прекрасно. (если вы питон и т.п. человек)

Редактировать: необходимо следующее: внутри «слева» находится TkText + TkScrollbar справа от него, я могу использовать только «верх», чтобы убедиться, что он работает по назначению (кнопки находятся ВЫШЕ TkText)


person NopeAndNever    schedule 30.09.2011    source источник


Ответы (4)


Упаковщик Tk работает, беря срез оставшегося пространства внутри внешнего виджета и выделяя этот срез внутреннему виджету. (side говорит, с какой стороны пространства удален фрагмент, fill говорит, как внутренний виджет занимает пространство, а expand говорит, как вещи реагируют на изменение размера внешнего виджета.) Внутри среза внутренний виджет располагается по центру. . Может потребоваться некоторая настройка, чтобы все исправить; обычно проще, если при этом вы меняете фон виджетов на разные (яркие) цвета, так как это облегчает просмотр того, что происходит.

Если то, что вы хотите, не может быть сделано с помощью упаковщика, вам нужно либо использовать вложенные фреймы, либо (лучше) переключиться на использование механизма компоновки сетки, который намного мощнее. (Очень причудливые вещи могут потребовать прослушивания событий <Configure> или использования россыпи, но на самом деле это редкость. 99,9% всех макетов можно сделать с помощью pack и grid.)

person Donal Fellows    schedule 30.09.2011
comment
Для этой простой программы я просто хочу использовать пакет, это было бы излишним. - person NopeAndNever; 02.10.2011
comment
@Nope: Хотя я обнаружил, что использую сетку даже для простых макетов (за очень немногими исключениями). Ну что ж, в конце концов, пробег меняется. Думаю, это зависит от того, как мы думаем… - person Donal Fellows; 03.10.2011

В отличие от многих разработчиков Tk, я предпочитаю пакет сетке, потому что так легче сформировать мысленную модель того, как это работает. Также можно создавать довольно сложные макеты, используя пакет. Мой концептуальный подход к этому заключается в том, чтобы использовать фрейм в качестве контейнера, а затем упаковывать объекты последовательно (все справа или слева) или бок о бок (слева/справа). Используя этот контейнерно-дочерний подход, вы можете упаковывать вещи куда угодно. Убедитесь, что объекты, которые вы хотите выровнять, находятся в одном контейнере/фрейме.

person Kevin Walzer    schedule 02.10.2011
comment
Может быть, короткий пример с 2 кадрами один горизонтальный один вертикальный и я всем доволен :-D Довольно, пожалуйста. - person NopeAndNever; 02.10.2011

Вы должны pack кнопки слева. Я изменил пример Tk, который нашел в Интернете:

require 'tk'

root = TkRoot.new
# button 1
btn_OK = TkButton.new(root) do
  text "OK"
  borderwidth 5
  underline 0
  state "normal"
  cursor "watch"
  font TkFont.new('times 20 bold')
  foreground  "red"
  activebackground "blue"
  relief      "groove"
  command (proc {})
  pack("side" => "left",  "padx"=> "50", "pady"=> "10")
end
# button 2
btn_Cancel = TkButton.new(root) do
  text "Cancel"
  borderwidth 5
  underline 0
  state "normal"
  cursor "watch"
  font TkFont.new('times 20 bold')
  foreground  "red"
  activebackground "blue"
  relief      "groove"
  command (proc { exit })
  pack("side" => "left",  "padx"=> "50", "pady"=> "10")
end
Tk.mainloop
person Michael Kohl    schedule 30.09.2011
comment
Отредактировал мой вопрос, чтобы отразить реальные требования. - person NopeAndNever; 30.09.2011

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

Обратите внимание, что наличие вложенных фреймов не означает, что вам нужно изменить родителя существующих виджетов. Опция in для упаковки (и сетки, и места) чрезвычайно полезна.

person Bryan Oakley    schedule 02.10.2011