Тк, как сделать макет с .pack? - PullRequest
0 голосов
/ 30 сентября 2011

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

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

Ответы [ 4 ]

1 голос
/ 30 сентября 2011

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

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

1 голос
/ 02 октября 2011

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

0 голосов
/ 03 октября 2011

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

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

0 голосов
/ 30 сентября 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...