text 'OK'

 command (proc ( puts 'Пользователь говорит OK.' })

 pack('side' => 'left')

end

Здесь мы создаем новую кнопку и присваиваем объект переменной btn_OK. Конструктору передается блок, хотя при желании можно было бы воспользоваться и хэшем. В данном случае мы записали блок на нескольких строчках (нам так больше нравится), хотя на практике в одну строку можно «напихать» сколько угодно кода. Напомним, кстати, что блок вычисляется методом instance_eval, то есть в контексте объекта (в данном случае — вновь созданного объекта TkButton).

Текст, заданный в качестве значения атрибута text, рисуется на кнопке. Он может состоять из нескольких слов и даже строк.

Как работает метод pack, мы уже видели, ничего нового здесь нет. Стоит лишь отметить, что без вызова pack виджет не будет виден.

Интересная часть — метод command, который принимает объект Proc и ассоциирует его с кнопкой. Часто для этой цели — и в данном случае тоже — применяется метод lambdaproc из модуля Kernel, который преобразует блок в объект Proc.

Выполняемое действие не очень осмысленно. Когда пользователь нажимает кнопку, вызывается неграфический метод puts, выводящий строку в окно команд, из которого была запущена программа, или, быть может, в окно дополнительной консоли.

Следующий пример более содержателен. В листинге 12.1 приведено приложение, имитирующее термостат. В нем отображается то увеличивающаяся, то уменьшающаяся температура (создавая иллюзию, будто мы включаем обогрев или охлаждение). Код сопровождается комментариями.

Листинг 12.1. Имитация термостата

require 'tk'

# Типичные параметры упаковки...

Тор = { 'side' => 'top', 'padx'=>5, 'pady'=>5 }

Left = { 'side' => 'left', 'padx'=>5, 'pady'=>5 }

Bottom = { 'side' => 'bottom', 'padx'=>5, 'pady'=>5 }

temp =74 # Начальная температура...

root = TkRoot.new { title 'Thermostat' }

top = TkFrame.new(root) { background '#606060' }

bottom = TkFrame.new(root)

tlab = TkLabel.new(top) do

 text temp.to_s

 font '{Arial} 54 {bold}'

 foreground 'green'

 background '#606060'

 pack Left

end

TkLabel.new(top) do # Символ градуса

 text 'о'

 font '{Arial} 14 {bold}'

 foreground 'green'

 background '#606060'

 # Включить в хэш прикрепление к северу (символ градуса отображается

 # в виде верхнего индекса).

 pack Left.update({ 'anchor' => 'n' })

end

TkButton.new(bottom) do

 text ' Up '

 command proc { tlab.configure('text'=>(temp+=1).to_s) }

 pack Left

end

TkButton.new(bottom) do

 text 'Down'

 command proc { tlab.configure('text'=>(temp-=1).to_s) }

 pack Left

end

top.pack Top

bottom.pack Bottom

Tk.mainloop

Здесь мы создали два фрейма. Верхний служит только для отображения температуры. Она измеряется по шкале Фаренгейта и для улучшения дизайна выводится крупным шрифтом (а символ градуса отображается маленькой буквой «о», расположенной справа сверху). Нижний фрейм содержит кнопки «вверх» и «вниз».

Обратите внимание на не встречавшиеся еще атрибуты объекта TkLabel. Метод font задает гарнитуру и размер шрифта, которым выводится текст метки. Строковое значение платформенно-зависимо; то, что приведено в примере, предназначено для ОС Windows. В системах UNIX обычно указывается длинное и малопонятное имя шрифта, принятое в X Window, например: -Adobe-Helvetica- Bold-R-Normal*-120-*-*-*-*-*-*.

Метод foreground задает цвет текста. Здесь мы передаем строку 'green' (которая в Tk имеет предопределенный смысл). Если вы хотите знать, предопределен ли тот иной цвет в Tk, то самое простое — попробовать.

Аналогично метод background задает цвет фона, на котором выводится текст. В данном случае мы передаем строку в другом формате, а именно указываем красную, зеленую и синюю компоненты в шестнадцатеричном виде, как принято в языке HTML и других случаях. (Строка '#606060' соответствует приятному серому цвету.)

Мы не включили никакой кнопки «выхода» (чтобы не загромождать окно). Как обычно, для того чтобы закрыть приложение, достаточно щелкнуть по иконке Close в правом верхнем углу рамки окна.

Отметим использование метода configure в описании команд для кнопок; он изменяет текст метки по мере того, как текущая температура уменьшается или увеличивается. Мы уже говорили, что таким образом почти все атрибуты можно изменять во время выполнения, причем изменение отображается на экране незамедлительно.

Упомянем еще две операции над текстовыми кнопками. Метод justify принимает один параметр ('left', 'right' или 'center'), определяющий выравнивание текста внутри кнопки (по умолчанию подразумевается 'center'). Мы говорили, что можно отображать многострочный текст; метод wraplength задает номер

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату