Ruby - Guia Tk

Introdução

A interface gráfica de usuário (GUI) padrão para Ruby é Tk. Tk começou como a GUI para a linguagem de script Tcl desenvolvida por John Ousterhout.

Tk tem a distinção única de ser a única interface gráfica de plataforma cruzada. Tk é executado em Windows, Mac e Linux e fornece uma aparência nativa em cada sistema operacional.

O componente básico de um aplicativo baseado em Tk é chamado de widget. Um componente também é às vezes chamado de janela, uma vez que, em Tk, "janela" e "widget" são freqüentemente usados ​​alternadamente.

Os aplicativos Tk seguem uma hierarquia de widgets em que qualquer número de widgets pode ser colocado em outro widget e esses widgets em outro widget, ad infinitum. O widget principal em um programa Tk é conhecido como widget raiz e pode ser criado criando uma nova instância da classe TkRoot.

  • A maioria dos aplicativos baseados em Tk segue o mesmo ciclo: criar os widgets, colocá-los na interface e, finalmente, vincular os eventos associados a cada widget a um método.

  • Existem três gerenciadores de geometria; lugar, grade e pacote que são responsáveis ​​por controlar o tamanho e a localização de cada um dos widgets na interface.

Instalação

As ligações Ruby Tk são distribuídas com Ruby, mas Tk é uma instalação separada. Os usuários do Windows podem baixar a instalação do Tk com um único clique do ActiveTcl do ActiveState .

Os usuários de Mac e Linux podem não precisar instalá-lo porque há uma grande chance de que ele já esteja instalado junto com o sistema operacional, mas se não, você pode baixar pacotes pré-construídos ou obter o código-fonte no Tcl Developer Xchange .

Aplicativo Tk Simples

Uma estrutura típica para programas Ruby / Tk é criar o principal ou root janela (uma instância de TkRoot), adicione widgets a ela para construir a interface do usuário e, em seguida, inicie o loop de evento principal chamando Tk.mainloop.

O tradicional Hello, World! exemplo para Ruby / Tk parece algo assim -

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

Aqui, depois de carregar o módulo de extensão tk, criamos um quadro de nível raiz usando TkRoot.new . Em seguida, criamos um widget TkLabel como filho do frame raiz, definindo várias opções para o rótulo. Por fim, empacotamos o quadro raiz e entramos no loop de eventos da GUI principal.

Se você executasse este script, ele produziria o seguinte resultado -

Ruby / Tk Widget Classes

Há uma lista de várias classes Ruby / Tk, que podem ser usadas para criar uma GUI desejada usando Ruby / Tk.

  • TkFrame Cria e manipula widgets de quadro.

  • TkButton Cria e manipula widgets de botão.

  • TkLabel Cria e manipula widgets de rótulo.

  • TkEntry Cria e manipula widgets de entrada.

  • TkCheckButton Cria e manipula widgets checkbutton.

  • TkRadioButton Cria e manipula widgets de botão de rádio .

  • TkListbox Cria e manipula widgets de caixa de listagem.

  • TkComboBox Cria e manipula widgets de caixa de listagem.

  • TkMenu Cria e manipula widgets de menu.

  • TkMenubutton Cria e manipula widgets de menu.

  • Tk.messageBox Cria e manipula um diálogo de mensagem.

  • TkScrollbar Cria e manipula widgets da barra de rolagem.

  • TkCanvas Cria e manipula widgets de tela.

  • TkScale Cria e manipula widgets de escala.

  • TkText Cria e manipula widgets de texto.

  • TkToplevel Cria e manipula widgets de nível superior.

  • TkSpinbox Cria e manipula widgets Spinbox.

  • TkProgressBar Cria e manipula widgets da barra de progresso.

  • Caixa de diálogo Cria e manipula widgets de caixa de diálogo.

  • Tk :: Tile :: Notebook Exibe várias janelas em espaço limitado com a metáfora do notebook.

  • Tk :: Tile :: Paned Exibe uma série de subjanelas, empilhadas vertical ou horizontalmente.

  • Tk :: Tile :: Separator Exibe uma barra separadora horizontal ou vertical.

  • Fonte, cores e imagens Ruby / Tk Noções básicas sobre fontes, cores e imagens Ruby / Tk

Opções de configuração padrão

Todos os widgets têm várias opções de configuração diferentes, que geralmente controlam como eles são exibidos ou como se comportam. As opções disponíveis dependem da classe do widget, é claro.

Aqui está uma lista de todas as opções de configuração padrão, que podem ser aplicáveis ​​a qualquer widget Ruby / Tk.

Sr. Não. Opções e descrição
1

activebackground => String

Especifica a cor de fundo a ser usada ao desenhar elementos ativos. Um elemento está ativo se o cursor do mouse estiver posicionado sobre o elemento e pressionar um botão do mouse fará com que alguma ação ocorra. Você pode usar nomes de cores como "vermelho", "azul", "rosa", "amarelo" etc.

2

activeborderwidth => Inteiro

Especifica um valor não negativo que indica a largura da borda 3D desenhada ao redor dos elementos ativos.

3

activeforeground => String

Especifica a cor de primeiro plano a ser usada ao desenhar elementos ativos.

4

anchor => String

Especifica como as informações em um widget (por exemplo, texto ou bitmap) devem ser exibidas no widget. Deve ser um dos valoresn, ne, e, se, s, sw, w, nw, ou center. Por exemplo,nw significa exibir as informações de forma que seu canto superior esquerdo esteja no canto superior esquerdo do widget.

5

background or bg => String

Especifica a cor de fundo normal a ser usada ao exibir o widget.

6

bitmap => Bitmap

Especifica um bitmap a ser exibido no widget. A maneira exata como o bitmap é exibido pode ser afetada por outras opções, como ancorar ou justificar.

7

borderwidth or bd => Inteiro

Especifica um valor não negativo indicando a largura da borda 3-D a ser desenhada ao redor do widget.

8

compound => String

Especifica se o widget deve exibir texto e bitmaps / imagens ao mesmo tempo e, em caso afirmativo, onde o bitmap / imagem deve ser colocado em relação ao texto. Deve ser um dos valoresnone, bottom, top, left, right, ou center.

9

cursor => String

Especifica o cursor do mouse a ser usado para o widget. Os valores possíveis podem ser "watch", "arrow" etc.

10

disabledforeground => String

Especifica a cor de primeiro plano a ser usada ao desenhar um elemento desativado.

11

exportselection => Booleano

Especifica se uma seleção no widget também deve ser a seleção X. O valor pode ter qualquer um dostrue, false, 0, 1, yes, ou no. Se a seleção for exportada, então selecionar no widget desmarca a seleção X atual, selecionar fora do widget desmarca qualquer seleção de widget e o widget responderá às solicitações de recuperação de seleção quando tiver uma seleção.

12

font => String

Especifica a fonte a ser usada ao desenhar texto dentro do widget.

13

foreground or fg => String

Especifica a cor de primeiro plano normal a ser usada ao exibir o widget.

14

highlightbackground => String

Especifica a cor a ser exibida na região de destaque transversal quando o widget não tem o foco de entrada.

15

highlightcolor => String

Especifica a cor a ser usada para o retângulo de destaque transversal que é desenhado ao redor do widget quando ele tem o foco de entrada.

16

highlightthickness => Inteiro

Especifica um valor não negativo que indica a largura do retângulo de destaque a ser desenhado ao redor do widget quando ele tem o foco de entrada.

17

image => Imagem

Especifica uma imagem a ser exibida no widget, que deve ter sido criada com uma criação de imagem. Normalmente, se a opção de imagem for especificada, ela substitui outras opções que especificam um bitmap ou valor textual a ser exibido no widget; a opção de imagem pode ser redefinida para uma string vazia para reativar um bitmap ou exibição de texto.

18

jump => String

Para widgets com um controle deslizante que pode ser arrastado para ajustar um valor, como barras de rolagem e escalas, esta opção determina quando as notificações são feitas sobre alterações no valor. O valor da opção deve ser booleano. Se o valor for falso, as atualizações são feitas continuamente conforme o controle deslizante é arrastado. Se o valor for verdadeiro, as atualizações serão atrasadas até que o botão do mouse seja liberado para encerrar o arrasto; nesse ponto, uma única notificação é feita.

19

justify => String

Quando há várias linhas de texto exibidas em um widget, esta opção determina como as linhas se alinham. Deve ser um dosleft, center, ou right. Left significa que todas as bordas esquerdas das linhas se alinham, center significa que os centros das linhas estão alinhados, e right significa que as bordas direitas das linhas estão alinhadas.

20

offset => String

Especifica o deslocamento dos ladrilhos (ver também tileopção). Pode ter dois formatos diferentesoffset x,y ou offset side, onde o lado pode estar n, ne, e, se, s, sw, w, nw, ou center.

21

orient => String

Para widgets que podem ser dispostos com orientação horizontal ou vertical, como barras de rolagem, esta opção especifica qual orientação deve ser usada. Deve ser qualquer umhorizontal ou vertical ou uma abreviatura de um destes.

22

padx => Inteiro

Especifica um valor não negativo indicando quanto espaço extra solicitar para o widget na direção X.

23

pady => Inteiro

Especifica um valor não negativo indicando quanto espaço extra solicitar para o widget na direção Y.

24

relief => Inteiro

Especifica o efeito 3-D desejado para o widget. Os valores aceitáveis ​​sãoraised, sunken, flat, ridgee groove.

25

repeatdelay => Inteiro

Especifica o número de milissegundos que um botão ou tecla deve ser pressionado antes de começar a se repetir automaticamente. Usado, por exemplo, nas setas para cima e para baixo nas barras de rolagem.

26

repeatinterval => Inteiro

Usado em conjunto com repeatdelay: uma vez que a repetição automática começa, esta opção determina o número de milissegundos entre as repetições automáticas

27

selectbackground => String

Especifica a cor de fundo a ser usada ao exibir os itens selecionados.

28

selectborderwidth => Inteiro

Especifica um valor não negativo indicando a largura da borda 3-D para desenhar ao redor dos itens selecionados.

29

selectforeground => String

Especifica a cor de primeiro plano a ser usada ao exibir os itens selecionados.

30

setgrid => Booleano

Especifica um valor booleano que determina se este widget controla a grade de redimensionamento para sua janela de nível superior. Esta opção é normalmente usada em widgets de texto, onde as informações no widget têm um tamanho natural (o tamanho de um caractere) e faz sentido que as dimensões da janela sejam números inteiros dessas unidades.

31

takefocus => Inteiro

Fornece informações usadas ao mover o foco de janela para janela por meio do teclado (por exemplo, Tab e Shift-Tab). Antes de definir o foco para uma janela, os scripts de passagem primeiro verificam se a janela é visível (ela e todos os seus ancestrais estão mapeados); caso contrário, a janela é ignorada. Um valor 0 significa que esta janela deve ser totalmente ignorada durante a passagem do teclado. 1 significa que esta janela deve sempre receber o foco de entrada.

32

text => String

Especifica uma string a ser exibida dentro do widget. A maneira como a string é exibida depende do widget específico e pode ser determinada por outras opções, comoanchor ou justify.

33

textvariable => Variável

Especifica o nome de uma variável. O valor da variável é uma string de texto a ser exibida dentro do widget; se o valor da variável mudar, o widget se atualizará automaticamente para refletir o novo valor. A maneira como a string é exibida no widget depende do widget específico e pode ser determinada por outras opções, comoanchor ou justify.

34

tile => Imagem

Especifica a imagem usada para exibir o widget. Se a imagem for uma string vazia, a cor de fundo normal será exibida.

35

troughcolor => String

Especifica a cor a ser usada para as áreas retangulares da calha em widgets, como barras de rolagem e escalas.

36

troughtile => Imagem

Especifica a imagem usada para exibição nas áreas retangulares da calha em widgets, como barras de rolagem e escalas.

37

underline => Inteiro

Especifica o índice inteiro de um caractere a sublinhar no widget. Esta opção é usada pelas ligações padrão para implementar a travessia do teclado para botões de menu e entradas de menu. 0 corresponde ao primeiro caractere do texto exibido no widget, 1 ao próximo caractere e assim por diante.

38

wraplength => Inteiro

Para widgets que podem realizar quebra de linha, esta opção especifica o comprimento máximo da linha.

39

xscrollcommand => função

Especifica um retorno de chamada usado para se comunicar com barras de rolagem horizontais.

40

yscrollcommand => função

Especifica um retorno de chamada usado para se comunicar com barras de rolagem verticais.

Gerenciamento de geometria Ruby / Tk

Gerenciamento de geometria lida com o posicionamento de widgets diferentes de acordo com a necessidade. O gerenciamento de geometria no Tk se baseia no conceito de widgets mestre e escravo.

Um mestre é um widget, normalmente uma janela de nível superior ou um quadro, que conterá outros widgets, que são chamados de escravos. Você pode pensar em um gerenciador de geometria como assumindo o controle do widget mestre e decidindo o que será exibido nele.

O gerenciador de geometria pedirá a cada widget escravo seu tamanho natural ou quão grande ele gostaria de ser exibido. Ele então pega essas informações e as combina com quaisquer parâmetros fornecidos pelo programa quando pede ao gerenciador de geometria para gerenciar aquele widget escravo específico.

Existem três gerenciadores de geometria local, grade e pacote que são responsáveis ​​por controlar o tamanho e a localização de cada um dos widgets na interface.

  • grade Gerenciador de geometria que organiza widgets em uma grade.

  • pack Gerenciador de geometria que se compacta ao redor das bordas da cavidade.

  • coloque o gerenciador de geometria para colocação fixa ou de folha de borracha.

Tratamento de eventos Ruby / Tk

Ruby / Tk suporta loop de evento , que recebe eventos do sistema operacional. São coisas como pressionamentos de botão, pressionamentos de tecla, movimento do mouse, redimensionamento de janela e assim por diante.

Ruby / Tk se encarrega de gerenciar esse loop de eventos para você. Ele descobrirá a qual widget o evento se aplica (o usuário clicou neste botão? Se uma tecla foi pressionada, qual caixa de texto estava em foco?) E o despachará de acordo. Widgets individuais sabem como responder a eventos, então, por exemplo, um botão pode mudar de cor quando o mouse se move sobre ele e reverter quando o mouse sai.

Em um nível superior, Ruby / Tk invoca retornos de chamada em seu programa para indicar que algo significativo aconteceu a um widget. Para qualquer caso, você pode fornecer um bloco de código ou um objeto Ruby Proc que especifica como o aplicativo responde ao evento ou retorno de chamada.

Vamos dar uma olhada em como usar o método bind para associar eventos básicos do sistema de janela aos procedimentos Ruby que os tratam. A forma mais simples de ligação leva como entrada uma string indicando o nome do evento e um bloco de código que Tk usa para manipular o evento.

Por exemplo, para capturar o evento ButtonRelease para o primeiro botão do mouse em algum widget, você escreveria -

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

Um nome de evento pode incluir modificadores e detalhes adicionais. Um modificador é uma string como Shift , Control ou Alt , indicando que uma das teclas modificadoras foi pressionada.

Assim, por exemplo, para capturar o evento que é gerado quando o usuário mantém pressionada a tecla Ctrl e clica com o botão direito do mouse.

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

Muitos widgets Ruby / Tk podem disparar callbacks quando o usuário os ativa, e você pode usar o comando callback para especificar que um determinado bloco de código ou procedimento é invocado quando isso acontece. Como visto anteriormente, você pode especificar o procedimento de retorno de chamada do comando ao criar o widget -

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

Ou você pode atribuí-lo mais tarde, usando o método de comando do widget -

helpButton.command proc { showHelp }

Visto que o método de comando aceita procedimentos ou blocos de código, você também pode escrever o exemplo de código anterior como -

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command { showHelp }
}
Sr. Não. Tag e descrição do evento
1

"1" (one)

Botão esquerdo do mouse clicado.

2

"ButtonPress-1"

Botão esquerdo do mouse clicado.

3

"Enter"

Movido o mouse para dentro.

4

"Leave"

Movido o mouse para fora.

5

"Double-1"

Clique duas vezes.

6

"B3-Motion"

Arraste o botão direito de uma posição para outra.

7

Control-ButtonPress-3

O botão direito é pressionado junto com a tecla Ctrl .

8

Alt-ButtonPress-1

O botão Let é pressionado junto com a tecla Alt .

O método de configuração

O método configure pode ser usado para definir e recuperar quaisquer valores de configuração do widget. Por exemplo, para alterar a largura de um botão, você pode chamar o método de configuração a qualquer momento da seguinte forma -

require "tk"

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

Para obter o valor de um widget atual, basta fornecê-lo sem um valor da seguinte forma -

color = button.configure('activebackground')

Você também pode chamar configure sem nenhuma opção, o que lhe dará uma lista de todas as opções e seus valores.

O método cget

Para simplesmente recuperar o valor de uma opção, configure retorna mais informações do que você geralmente deseja. O método cget retorna apenas o valor atual.

color = button.cget('activebackground')