Категории
Самые читаемые
Лучшие книги » Компьютеры и Интернет » Программирование » Программирование на языке Ruby - Хэл Фултон

Программирование на языке Ruby - Хэл Фултон

Читать онлайн Программирование на языке Ruby - Хэл Фултон

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 91 92 93 94 95 96 97 98 99 ... 156
Перейти на страницу:

require "tk"

# Подготовка интерфейса приложения...

Tk.mainloop

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

Классы виджетов именуются так, как принято в мире Tk (в начале идет префикс Tk). Например, виджету 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 n%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

 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

1 ... 91 92 93 94 95 96 97 98 99 ... 156
Перейти на страницу:
На этой странице вы можете бесплатно скачать Программирование на языке Ruby - Хэл Фултон торрент бесплатно.
Комментарии