Учебники

Ruby — Tk Guide

Стандартный графический пользовательский интерфейс (GUI) для Ruby — Tk. Tk начинал как графический интерфейс для языка сценариев Tcl, разработанного Джоном Оустерхаутом.

Tk имеет уникальное отличие — единственный кроссплатформенный графический интерфейс. Tk работает на Windows, Mac и Linux и обеспечивает естественный внешний вид для каждой операционной системы.

Основной компонент приложения на основе Tk называется виджетом. Компонент также иногда называют окном, поскольку в Tk «окно» и «виджет» часто используются взаимозаменяемо.

Приложения Tk следуют иерархии виджетов, где любое количество виджетов может быть размещено в другом виджете, а эти виджеты — в другом виджете до бесконечности. Основной виджет в программе Tk называется корневым виджетом и может быть создан путем создания нового экземпляра класса TkRoot.

  • Большинство приложений на основе Tk следуют одному и тому же циклу: создают виджеты, помещают их в интерфейс и, наконец, связывают события, связанные с каждым виджетом, с методом.

  • Есть три менеджера геометрии; place, grid и pack , которые отвечают за управление размером и расположением каждого из виджетов в интерфейсе.

Большинство приложений на основе Tk следуют одному и тому же циклу: создают виджеты, помещают их в интерфейс и, наконец, связывают события, связанные с каждым виджетом, с методом.

Есть три менеджера геометрии; place, grid и pack , которые отвечают за управление размером и расположением каждого из виджетов в интерфейсе.

Монтаж

Привязки Ruby Tk распространяются вместе с Ruby, но Tk — это отдельная установка. Пользователи Windows могут загрузить установку Tk одним щелчком мыши из ActiveScl ActiveState .

Пользователям Mac и Linux может и не понадобиться устанавливать его, потому что есть большая вероятность, что он уже установлен вместе с ОС, но если нет, вы можете загрузить готовые пакеты или получить исходный код из Tcl Developer Xchange .

Простое приложение Tk

Типичная структура для программ Ruby / Tk — это создание главного или корневого окна (экземпляр TkRoot), добавление к нему виджетов для создания пользовательского интерфейса, а затем запуск цикла основного события путем вызова Tk.mainloop .

Традиционный Привет, Мир! пример для Ruby / Tk выглядит примерно так —

require 'tk'

root = TkRoot.new { title "Hello, World!" }
TkLabel.new(root) do
   text 'Hello, World!'
   pack { padx 15 ; pady 15; side 'left' }
end
Tk.mainloop

Здесь, после загрузки модуля расширения tk, мы создаем фрейм корневого уровня, используя TkRoot.new . Затем мы создаем виджет TkLabel как дочерний элемент корневого фрейма, устанавливая несколько параметров для метки. Наконец, мы упаковываем корневой фрейм и входим в основной цикл событий GUI.

Если вы запустите этот скрипт, он даст следующий результат —

Ruby / Tk Hello World

Классы Ruby / Tk Widget

Существует список различных классов Ruby / Tk, которые можно использовать для создания желаемого GUI с использованием Ruby / Tk.

  • TkFrame Создает и манипулирует виджетами фреймов.

  • TkButton Создает и манипулирует виджетами кнопок.

  • TkLabel Создает и манипулирует виджетами надписей .

  • TkEntry Создает и управляет входными виджетами.

  • TkCheckButton Создает и манипулирует виджетами с кнопками.

  • TkRadioButton Создает и управляет виджетами радиокнопок.

  • TkListbox Создает и управляет виджетами списка.

  • TkComboBox Создает и управляет виджетами списка.

  • TkMenu Создает и управляет виджетами меню.

  • TkMenubutton Создает виджеты меню и управляет ими.

  • Tk.messageBox Создает и манипулирует диалоговым окном сообщения.

  • TkScrollbar Создает и манипулирует виджетами полосы прокрутки.

  • TkCanvas Создает и управляет виджетами холста.

  • TkScale Создает и манипулирует масштабными виджетами.

  • TkText Создает и манипулирует текстовыми виджетами.

  • TkToplevel Создает и управляет виджетами верхнего уровня.

  • TkSpinbox Создает и управляет виджетами Spinbox.

  • TkProgressBar Создает и манипулирует виджетами индикатора выполнения.

  • Диалоговое окно Создание и управление виджетами диалогового окна.

  • Tk :: Tile :: Notebook Отображение нескольких окон в ограниченном пространстве с метафорой ноутбука.

  • Tk :: Tile :: Paned Отображает количество подокон, сложенных вертикально или горизонтально.

  • Tk :: Tile :: Separator Отображает горизонтальный или вертикальный разделитель.

  • Шрифт Ruby / Tk, цвета и изображения Общие сведения о шрифтах Ruby / Tk, цвета и изображения

TkFrame Создает и манипулирует виджетами фреймов.

TkButton Создает и манипулирует виджетами кнопок.

TkLabel Создает и манипулирует виджетами надписей .

TkEntry Создает и управляет входными виджетами.

TkCheckButton Создает и манипулирует виджетами с кнопками.

TkRadioButton Создает и управляет виджетами радиокнопок.

TkListbox Создает и управляет виджетами списка.

TkComboBox Создает и управляет виджетами списка.

TkMenu Создает и управляет виджетами меню.

TkMenubutton Создает виджеты меню и управляет ими.

Tk.messageBox Создает и манипулирует диалоговым окном сообщения.

TkScrollbar Создает и манипулирует виджетами полосы прокрутки.

TkCanvas Создает и управляет виджетами холста.

TkScale Создает и манипулирует масштабными виджетами.

TkText Создает и манипулирует текстовыми виджетами.

TkToplevel Создает и управляет виджетами верхнего уровня.

TkSpinbox Создает и управляет виджетами Spinbox.

TkProgressBar Создает и манипулирует виджетами индикатора выполнения.

Диалоговое окно Создание и управление виджетами диалогового окна.

Tk :: Tile :: Notebook Отображение нескольких окон в ограниченном пространстве с метафорой ноутбука.

Tk :: Tile :: Paned Отображает количество подокон, сложенных вертикально или горизонтально.

Tk :: Tile :: Separator Отображает горизонтальный или вертикальный разделитель.

Шрифт Ruby / Tk, цвета и изображения Общие сведения о шрифтах Ruby / Tk, цвета и изображения

Стандартные параметры конфигурации

Все виджеты имеют ряд различных параметров конфигурации, которые обычно управляют тем, как они отображаются или как они ведут себя. Доступные параметры зависят от класса виджета.

Вот список всех стандартных параметров конфигурации, которые могут быть применимы к любому виджету Ruby / Tk.

activebackground => Строка

Определяет цвет фона для использования при рисовании активных элементов. Элемент активен, если курсор мыши расположен над элементом, и нажатие кнопки мыши вызовет некоторое действие. Вы можете использовать названия цветов, такие как «красный», «синий», «розовый», «желтый» и т. Д.

activeborderwidth => Целое число

Указывает неотрицательное значение, указывающее ширину трехмерной границы, нарисованной вокруг активных элементов.

activeforeground => Строка

Определяет цвет переднего плана для использования при рисовании активных элементов.

якорь => Строка

Определяет, как информация в виджете (например, текст или растровое изображение) должна отображаться в виджете. Должно быть одно из значений n , ne , e , se , s , sw , w , nw или center . Например, nw означает отображение информации таким образом, чтобы ее верхний левый угол находился в верхнем левом углу виджета.

background или bg => String

Определяет нормальный цвет фона, используемый при отображении виджета.

bitmap => Bitmap

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

borderwidth или bd => Integer

Указывает неотрицательное значение, указывающее ширину трехмерной границы для рисования вокруг внешней стороны виджета.

составной => Строка

Указывает, должен ли виджет отображать текст и растровые изображения / изображения одновременно, и если да, то где растровое изображение / изображение должны быть размещены относительно текста. Должно быть одно из значений none , bottom , top , left , right или center .

курсор => строка

Указывает курсор мыши, который будет использоваться для виджета. Возможные значения: «смотреть», «стрелка» и т. Д.

disabledforeground => Строка

Определяет цвет переднего плана для использования при рисовании отключенного элемента.

exportselection => Булево

Определяет, должен ли выбор в виджете также быть X-выбором. Значение может иметь любое из значений true , false , 0 , 1 , yes или no . Если выборка экспортируется, то выбор в виджете отменяет текущий выбор X, выбор вне виджета отменяет выбор любого виджета, и виджет будет отвечать на запросы поиска выбора, когда у него есть выбор.

font => String

Указывает шрифт, который будет использоваться при рисовании текста внутри виджета.

передний план или fg => строка

Определяет обычный цвет переднего плана для использования при отображении виджета.

highlightbackground => Строка

Определяет цвет для отображения в области выделения обхода, когда виджет не имеет фокуса ввода.

highlightcolor => String

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

highlightthickness => Целое число

Указывает неотрицательное значение, указывающее ширину выделенного прямоугольника для рисования вокруг внешней стороны виджета, когда он имеет фокус ввода.

изображение => изображение

Определяет изображение для отображения в виджете, который должен быть создан с созданием изображения. Как правило, если указан параметр изображения, он переопределяет другие параметры, которые указывают растровое или текстовое значение для отображения в виджете; опция изображения может быть сброшена на пустую строку, чтобы снова включить растровое изображение или текстовое отображение.

jump => String

Для виджетов с ползунком, который можно перетаскивать для настройки значения, например полосы прокрутки и шкалы, этот параметр определяет, когда создаются уведомления об изменениях значения. Значение параметра должно быть логическим. Если значение равно false, обновления производятся непрерывно при перемещении ползунка. Если значение равно true, обновления задерживаются до тех пор, пока не будет отпущена кнопка мыши, чтобы завершить перетаскивание; в этот момент делается одно уведомление.

justify => String

Когда в виджете отображается несколько строк текста, этот параметр определяет, как линии выстраиваются в линию друг с другом. Должно быть одним из слева , в центре или справа . Левый означает, что все левые края линий выровнены, центр означает, что центры линий выровнены, а правый означает, что правые края линий выровнены.

смещение => Строка

Определяет смещение тайлов (см. Также опцию тайлов ). Он может иметь два различных формата смещения x, y или сторону смещения , где сторона может быть n , ne , e , se , s , sw , w , nw или center .

orient => String

Для виджетов, которые могут размещаться с горизонтальной или вертикальной ориентацией, таких как полосы прокрутки, этот параметр указывает, какую ориентацию следует использовать. Должно быть либо горизонтальным, либо вертикальным, либо сокращением одного из них.

padx => Integer

Указывает неотрицательное значение, указывающее, сколько дополнительного пространства нужно запрашивать для виджета в направлении X.

pady => Целое число

Указывает неотрицательное значение, указывающее, сколько дополнительного пространства нужно запрашивать для виджета в направлении Y.

рельеф => целое число

Указывает трехмерный эффект, необходимый для виджета. Допустимые значения: приподнятый , утопленный , плоский , ребристый и желобчатый

repeatdelay => Integer

Указывает количество миллисекунд, в течение которых кнопка или клавиша должны удерживаться, прежде чем они начнут повторяться автоматически. Используется, например, для стрелок вверх и вниз на полосах прокрутки.

repeatinterval => Integer

Используется совместно с repeatdelay : после запуска автоповтора этот параметр определяет количество миллисекунд между автоповторами

selectbackground => String

Определяет цвет фона, используемый при отображении выбранных элементов.

selectborderwidth => Целое число

Указывает неотрицательное значение, указывающее ширину трехмерной границы для рисования вокруг выбранных элементов.

selectforeground => String

Определяет цвет переднего плана для использования при отображении выбранных элементов.

setgrid => логическое значение

Указывает логическое значение, определяющее, управляет ли этот виджет сеткой изменения размера для своего окна верхнего уровня. Эта опция обычно используется в текстовых виджетах, где информация в виджете имеет естественный размер (размер символа), и имеет смысл, чтобы размеры окна были целыми числами этих единиц.

takefocus => Integer

Предоставляет информацию, используемую при перемещении фокуса от окна к окну с помощью обхода клавиатуры (например, Tab и Shift-Tab). Перед установкой фокуса на окно, сценарии обхода сначала проверяют, является ли окно видимым (оно и все его предки отображаются); если нет, окно пропускается. Значение 0 означает, что это окно должно быть полностью пропущено во время обхода клавиатуры. 1 означает, что это окно всегда должно получать фокус ввода.

текст => строка

Определяет строку, которая будет отображаться внутри виджета. Способ отображения строки зависит от конкретного виджета и может определяться другими параметрами, такими как привязка или выравнивание .

textvariable => переменная

Определяет имя переменной. Значением переменной является текстовая строка, которая будет отображаться внутри виджета; если значение переменной изменится, виджет автоматически обновится, чтобы отразить новое значение. Способ отображения строки в виджете зависит от конкретного виджета и может определяться другими параметрами, такими как привязка или выравнивание .

плитка => Изображение

Определяет изображение, используемое для отображения виджета. Если изображение — пустая строка, то отображается нормальный цвет фона.

troughcolor => String

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

troughtile => изображение

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

подчеркивание => целое число

Задает целочисленный индекс символа, который следует подчеркнуть в виджете. Эта опция используется привязками по умолчанию для реализации обхода клавиатуры для кнопок меню и пунктов меню. 0 соответствует первому символу текста, отображаемого в виджете, 1 — следующему символу и т. Д.

обертка => целое число

Для виджетов, которые могут выполнять перенос слов, эта опция указывает максимальную длину строки.

xscrollcommand => функция

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

yscrollcommand => функция

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

Ruby / Tk Geometry Management

Geometry Management имеет дело с позиционированием различных виджетов согласно требованию. Управление геометрией в Tk основывается на концепции главных и подчиненных виджетов.

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

Менеджер геометрии запросит у каждого подчиненного виджета его естественный размер или размер, который он идеально хотел бы отображать. Затем он берет эту информацию и объединяет ее с любыми параметрами, предоставленными программой, когда просит администратора геометрии управлять этим конкретным подчиненным виджетом.

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

  • grid Менеджер геометрии, который размещает виджеты в сетке.

  • pack Geometry manager, который упаковывает края ребер.

  • Размещение Geometry Manager для фиксированного размещения или размещения резиновых листов.

grid Менеджер геометрии, который размещает виджеты в сетке.

pack Geometry manager, который упаковывает края ребер.

Размещение Geometry Manager для фиксированного размещения или размещения резиновых листов.

Обработка событий Ruby / Tk

Ruby / Tk поддерживает цикл обработки событий , который получает события из операционной системы. Это такие вещи, как нажатия кнопок, нажатие клавиш, движение мыши, изменение размера окна и т. Д.

Ruby / Tk позаботится об управлении этим циклом событий для вас. Он выяснит, к какому виджету применимо событие (нажал ли пользователь на эту кнопку? Если была нажата клавиша, какое текстовое поле имело фокус?), И отправил его соответствующим образом. Отдельные виджеты знают, как реагировать на события, поэтому, например, кнопка может изменить цвет при наведении на нее курсора мыши и вернуться назад, когда мышь уйдет.

На более высоком уровне Ruby / Tk вызывает в вашей программе обратные вызовы, чтобы указать, что с виджетом произошло что-то существенное. В любом случае вы можете предоставить блок кода или объект Ruby Proc, который определяет, как приложение реагирует на событие или обратный вызов.

Давайте посмотрим, как использовать метод bind, чтобы связать основные системные события окна с процедурами Ruby, которые их обрабатывают. Простейшая форма связывания принимает в качестве входных данных строку, обозначающую имя события и кодовый блок, который Tk использует для обработки события.

Например, чтобы поймать событие ButtonRelease для первой кнопки мыши в каком-либо виджете, вы должны написать:

someWidget.bind('ButtonRelease-1') {
   ....code block to handle this event...
}

Имя события может включать в себя дополнительные модификаторы и детали. Модификатор — это строка типа Shift , Control или Alt , указывающая, что была нажата одна из клавиш-модификаторов.

Так, например, чтобы отловить событие, которое генерируется, когда пользователь удерживает нажатой клавишу Ctrl и щелкает правой кнопкой мыши.

someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })

Многие виджеты Ruby / Tk могут вызывать обратные вызовы, когда пользователь активирует их, и вы можете использовать команду обратного вызова, чтобы указать, что определенный блок кода или процедура вызывается, когда это происходит. Как было показано ранее, вы можете указать процедуру обратного вызова команды при создании виджета —

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command proc { showHelp }
}

Или вы можете назначить его позже, используя метод команды виджета —

helpButton.command proc { showHelp }

Поскольку командный метод принимает либо процедуры, либо блоки кода, вы также можете написать предыдущий пример кода как —

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command { showHelp }
}

«1» (один)

Щелкнул левой кнопкой мыши.

«ButtonPress-1»

Щелкнул левой кнопкой мыши.

«Войти»

Перемещена мышь внутри.

«Покидать»

Вытащили мышь наружу.

«Double-1»

Дважды щелкнул.

«B3-Motion»

Перетащите правую кнопку из одной позиции в другую.

Control-ButtonPress-3

Правая кнопка нажата вместе с клавишей Ctrl .

Alt-ButtonPress-1

Пусть кнопка нажата вместе с Alt Key.

Метод настройки

Метод configure можно использовать для установки и получения любых значений конфигурации виджета. Например, чтобы изменить ширину кнопки, вы можете вызвать метод configure в любое время следующим образом:

require "tk"

button = TkButton.new {
   text 'Hello World!'
   pack
}
button.configure('activebackground', 'blue')
Tk.mainloop

Чтобы получить значение для текущего виджета, просто укажите его без значения следующим образом:

color = button.configure('activebackground')

Вы также можете вызвать configure без каких-либо параметров, что даст вам список всех параметров и их значений.

Метод cget

Для простого получения значения параметра, configure возвращает больше информации, чем вы обычно хотите. Метод cget возвращает только текущее значение.