Например, виджету Frame соответствует класс TkFrame.
Понятно, что виджеты создаются методом new. Первый параметр определяет контейнер, в который помещается виджет; если он опущен, подразумевается корневой контейнер.
Дополнительные параметры виджета можно задавать двумя способами. Первый (в духе Perl) — передать хэш, содержащий названия и значения атрибутов. (Напомним, что в Ruby при передаче хэша последним или единственным параметром фигурные скобки можно опускать).
my_widget = TkSomewidget.new( 'borderwidth' => 2, 'height' => 40 ,
'justify' => 'center' )
Другой способ — передать конструктору блок, который будет вычислен методом instance_eval. Внутри блока можно вызывать методы для установки атрибутов виджета (такие методы называются так же, как сами атрибуты). Имейте в виду, что блок вычисляется в контексте вызываемого объекта, а не вызывающей программы. Это означает, например, что к переменным экземпляра вызывающего объекта в блоке обращаться нельзя.
my_widget = TkSomewidget.new do
borderwidth 2
height 40
justify 'center'
end
Tk предоставляет три геометрических менеджера для управления относительным размером и расположением виджетов на экране. Наиболее распространенный из них — pack, остальные два — grid и place. Менеджер grid обладает богатыми возможностями, но не свободен от ошибок; place — самый простой из трех, он требует, чтобы были заданы абсолютные координаты всех расположенных внутри него виджетов. В примерах ниже мы будем пользоваться только менеджером pack.
12.1.2. Простое оконное приложение
Продемонстрируем очень простое приложение — окно, в котором выводится текущая дата. Начнем с явного создания корневого контейнера root и поместим в него виджет Label.
require 'tk'
root = TkRoot.new() { title 'Today's Date' }
str = Time.now.strftime('Today is
%B %d, %Y')
lab = TkLabel.new(root) do
text str
pack('padx' => 15, 'pady' => 10, 'side' => 'top')
end
Tk.mainloop
Здесь мы создали корневой контейнер, сформировали строку даты и создали метку. В качестве текста, изображаемого на метке, мы задали строку str, а чтобы все выглядело аккуратно, вызвали метод pack, которому сказали, что отступ по горизонтали должен составлять 15 пикселей, а по вертикали — 10 пикселей. Текст мы попросили отцентрировать в границах метки.
На рис. 12.1 показано, как выглядит окно приложения.
Рис. 12.1. Простое приложение Tk
Как было сказано выше, создать метку можно было бы и так:
lab = TkLabel.new(root) do
text str
pack('padx' => 15, 'pady' => 10,
'side' => 'top')
end
Экранные единицы измерения (в примере выше мы их использовали для указания padx и pady) — по умолчанию пиксели. Можно применять и другие единицы, если добавить к числу суффикс. Тогда значение становится строковым, но поскольку Ruby/Tk на это наплевать, то и мы не станем беспокоиться. Допустимы следующие единицы измерения: сантиметры (с), миллиметры (m), дюймы (i) и пункты (р). Все показанные ниже способы указания padx правильны:
pack('padx' => '80m')
pack('padx' => '8с')
pack('padx' => '3i')
pack('padx' => '12p')
Атрибут side в данном случае не дает ничего, поскольку мы установили его значение по умолчанию. Если вы измените размер окна, то текст останется «приклеенным» к верхней части той области, которой принадлежит. Другие возможные значения side: right, left и bottom.
У метода pack есть и другие атрибуты, управляющие размещением виджетов на экране. Мы рассмотрим не все.
Атрибут fill указывает, должен ли виджет заполнять весь выделенный для него прямоугольник (по горизонтали и/или по вертикали). Допустимые значения: x, у, both и none (по умолчанию none).
Атрибут anchor «скрепляет» виджет с теми или иными сторонами его прямоугольника; при этом применяется нотация «сторон света». По умолчанию подразумевается значение center, другие допустимые значения: n, s, e, w, ne, nw, se, sw.
Атрибут in упаковывает виджет относительно контейнера, отличного от его родительского. По умолчанию, конечно, принимается родительский контейнер.
Атрибуты before и after позволяют произвольно задавать порядок упаковки виджетов. Это полезно, поскольку виджеты могут создаваться не в том порядке, в котором расположены на экране.
В общем, Tk обеспечивает достаточную гибкость при размещении виджетов в окне. Читайте документацию и экспериментируйте.
12.1.3. Кнопки
В любом графическом интерфейсе кнопка — один из наиболее употребительных виджетов. Как и следовало ожидать, в Ruby/Tk кнопка представляется классом TkButton.
В нетривиальных приложениях обычно создаются фреймы, содержащие разные виджеты. Кнопка может располагаться внутри такого фрейма.
Обычно для кнопки задаются по меньшей мере три атрибута:
• текст кнопки;
• ассоциированная с кнопкой команда (исполняемая в результате нажатия);
• способ упаковки кнопки в объемлющем контейнере.
Вот простенький пример:
btn_OK = TkButton.new do
