Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

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 приведено приложение, имитирующее термостат. В нем отображается то увеличивающаяся, то уменьшающаяся температура (создавая иллюзию, будто мы включаем обогрев или охлаждение). Код сопровождается комментариями.

Поделиться:
Популярные книги

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Позывной "Князь" 2

Котляров Лев
2. Князь Эгерман
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Позывной Князь 2

Черный Маг Императора 16

Герда Александр
16. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 16

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Чехов книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Чехов книга 3

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Возвращение Безумного Бога 2

Тесленок Кирилл Геннадьевич
2. Возвращение Безумного Бога
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 2

Зодчий. Книга I

Погуляй Юрий Александрович
1. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга I

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17