колонки, в которой происходит перенос слова.
Стиль кнопки можно изменить методом relief
, придав ей трехмерный вид. В качестве параметра этому методу можно передать одну из строк: 'flat'
, 'groove'
, 'raised'
, 'ridge'
(по умолчанию), 'sunken'
или 'solid'
. Методы width
и height
явно задают размеры кнопки. Имеется также метод borderwidth
и аналогичные. О других атрибутах (которых немало) вы можете прочесть в руководстве.
Рассмотрим еще один пример использования кнопки. На этой кнопке будет изображение, а не просто текст.
Я создал GIF-файлы с изображениями стрелок, указывающих вверх и вниз (up.gif
и down.gif
). Для получения ссылок на них можно воспользоваться классом TkPhotoimage
, а затем передать эти ссылки в качестве параметров при создании кнопок.
up_img = TkPhotoimage.new('file'=>'up.gif')
down_img = TkPhotoimage.new('file'=>'down.gif')
TkButton.new(bottom) do
image up_img
command proc { tlab.configure('text'=>(temp+=1).to_s) }
pack Left
end
TkButton.new(bottom) do
image down_img
command proc { tlab.configure('text'=>(temp-=1).to_s) }
pack Left
end
Здесь просто заменены некоторые строки в первом примере. Если не считать внешнего вида кнопок, то поведение не изменилось. На рис. 12.2 показано окно приложения.
Рис. 12.2. Имитация термостата (с графическими кнопками)
12.1.4. Текстовые поля
Чтобы отобразить поле для ввода текста и манипулировать им, применяется виджет TkEntry
. Как и следовало ожидать, для указания размера, цвета и поведения предусмотрены многочисленные атрибуты. Мы приведем довольно объемный пример, иллюстрирующий применение некоторых из них.
Поле ввода полезно лишь, если существует способ получить введенное в него значение. Обычно поле связывается с переменной (если быть точным, с объектом TkVariable
), хотя можно воспользоваться и методом get
.
Предположим, что мы разрабатываем telnet-клиент, который принимает четыре параметра: адрес хоста, номер порта (по умолчанию 23), имя пользователя и его пароль. Для красоты добавим еще две кнопки для операций «войти» и «отменить».
В представленном фрагменте используются фреймы, чтобы форма выглядела аккуратнее. Правда, написанный код не переносим, и настоящий знаток Tk с презрением отверг бы его. Но просто для сведения мы все-таки документировали этот «небрежный» подход к организации информации на экране.
Вид окна показан на рис. 12.3, а код — в листинге 12.2.
Рис. 12.3. Имитация telnet-клиента
require 'tk'
def packing(padx, pady, side=:left, anchor=:n)
{ 'padx' => padx, 'pady' => pady,
'side' => side.to_s, 'anchor' => anchor.to_s }
end
root = TkRoot.new() { title 'Telnet session' }
top = TkFrame.new(root)
fr1 = TkFrame.new(top)
fr1a = TkFrame.new(fr1)
fr1b = TkFrame.new(fr1)
fr2 = TkFrame.new(top)
fr3 = TkFrame.new(top)
fr4 = TkFrame.new(top)
LabelPack = packing(5, 5, :top, :w)
EntryPack = packing(5, 2, :top)
ButtonPack = packing(15, 5, :left, :center)
FramePack = packing(2, 2, :top)
FramelPack = packing(2, 2, :left)
var_host = TkVariable.new
var_port = TkVariable.new
var_user = TkVariable.new
var_pass = TkVariable.new
lab_host = TkLabel.new(fr1a) do
text 'Host name'
pack LabelPack
end
ent_host = TkEntry.new(fr1a) do
textvariable var_host
font '{Arial} 10'
pack EntryPack
end
lab_port = TkLabel.new(fr1b) do
text 'Port'
pack LabelPack
end
ent_port = TkEntry.new(fr1b) do
width 4
textvariable var_port