Criando um Layout Interativo Tkinter - Programadores Brasil
Linguagens de programaçãoPythonTutoriais de PythonTutoriais para Python

[Python] Criando um Layout Interativo com Tkinter

6 Mins read

Já vimos o básico do Tkinter e como posicionar objetos geometricamente, então já temos a base de como criar uma janela, adicionar alguns widgets e controlar o layout do aplicativo. Isso é ótimo, mas os aplicativos não devem apenas ter uma boa aparência – eles realmente precisam fazer algo! No tutorial de hoje, você aprenderá como dar vida aos seus aplicativos realizando ações sempre que determinados eventos ocorrerem criando um layout interativo Tkinter.

Usando eventos e handlers de eventos

Ao criar um layout interativo Tkinter, a função window.mainloop( ) é chamada para iniciar o loop de eventos. Durante o loop de eventos, seu aplicativo verifica se um evento ocorreu. Nesse caso, algum código pode ser executado em resposta.

O loop de eventos é fornecido ao utilizar Tkinter, então não é preciso escrever nenhum código que verifique os eventos por conta própria, somente o código que é executado quando o evento ocorre. Neste caso, são escritas funções chamadas manipuladoras (handlers) de eventos para os eventos que você usa em seu aplicativo.

Veremos agora um exemplo de loop de evento para entender melhor como funciona o loop de eventos próprio do Tkinter. Suponha que haja uma lista chamada events_list que contém objetos de evento. Um novo objeto de evento é automaticamente anexado a events_list toda vez que ocorre um evento em seu programa. (Não é necessária a implementação, isto ocorreria automaticamente neste exemplo conceitual) Usando um loop infinito, você pode verificar continuamente se há algum objeto de evento em events_list:

# Uma lista continuamente atualizada
events_list = []

# loop de eventos
while True:
    # Se a lista estiver vazia, não há eventos ocorrendo e a execução passa para o próximo loop
    if events_list == []:
        continue

    # Se chega a este ponto, há pelo menos um evento na lista ocorrendo
    event = events_list[0]

No momento, o loop de evento que não faz nada com o evento. Vamos mudar isso. Suponha que o aplicativo precise responder aos pressionamentos de tecla. Para isso é preciso verificar se o evento foi gerado por um usuário pressionando uma tecla em seu teclado e, em caso afirmativo, passar o evento para uma função de manipulador de eventos para os pressionamentos de tecla.

Suponha que o evento tenha um atributo .type definido para a stringkeypress” se o evento for um objeto de evento de pressionamento de tecla e um atributo .char contendo o caractere da tecla que foi pressionada. Então uma nova função (handle_keypress( )) é utilizada para computar essas duas informações e imprimir a tecla pressionada:

events_list = []

# Cria um handler de eventos
def handle_keypress(event):
    #Imprime o caractere da tecla pressionada
    print(event.char)

while True:
    if events_list == []:
        continue
    event = events_list[0]

    # Se um evento do tipo keypress acontece, o handler associado é executado
    if event.type == "keypress":
        handle_keypress(event)

Quando a função window.mainloop( ) é utilizada, algo como o loop acima é executado. Este método cuida de duas partes do loop: mantém uma lista de eventos que ocorreram e executa um handler de eventos sempre que um novo evento é adicionado a essa lista. Veremos agora como isso funciona no Tkinter:

import tkinter as tk

window = tk.Tk()

def handle_keypress(event):
    print(event.char)

window.bind("<Key>", handle_keypress)

window.mainloop()

O método .bind( ) é utilizado no código para indicar para o Tkinter quando utilizar o método handle_keypress( ). Para chamar um handler de eventos sempre que ocorrer um evento em um widget, use .bind( ). Diz-se que o handler de eventos está vinculado ao evento porque é chamado sempre que o evento ocorre. Aqui, handle_keypress( ) é vinculado a um evento “<Key>” usando window.bind( ). Sempre que uma tecla é pressionada enquanto o aplicativo está em execução, o programa imprimirá o caractere da tecla pressionada. O método .bind( ) recebe dois argumentos:

  • Um evento que é representado por uma string da forma “”<nomedoevento>, onde nomedoevento pode ser qualquer um dos eventos do Tkinter;
  • Um handler de eventos que é o nome da função a ser chamada sempre que o evento ocorre.

No exemplo acima, o handler está vinculado à própria janela, mas você pode vincular um manipulador de eventos a qualquer widget em seu aplicativo. Por exemplo, você pode vincular um handler a um widget de botão que executará alguma ação sempre que o botão for pressionado:

def handle_click(event):
    print("O botão foi clicado!")

button = tk.Button(text="Clique aqui!")

button.bind("<Button-1>", handle_click)

Neste exemplo, o evento “<Button-1>” no widget de botão está vinculado a handle_click. O evento “<Button-1>” ocorre sempre que o botão esquerdo do mouse é pressionado enquanto o mouse está sobre o widget. Existem outros eventos para cliques do botão do mouse, incluindo “<Button-2>” para o botão do meio e “<Button-3>” para o botão direito do mouse.

Layout Interativo Tkinter: Atribuindo funções a widgets de botão

Cada widget de botão tem um atributo de command que pode ser usado para atribuir este botão a uma função. Sempre que o botão é pressionado, a função é executada. É um jeito mais fácil de atribuir eventos a botões do que utilizando .bind( ).

Primeiro, criaremos uma janela com um widget Label que contém um valor numérico, então colocaremos botões no lado esquerdo e direito do Label. O botão esquerdo será usado para diminuir o valor no label, e o botão direito aumentará o valor. Exemplo:

import tkinter as tk

window = tk.Tk()

window.rowconfigure(0, minsize=50, weight=1)
window.columnconfigure([0, 1, 2], minsize=50, weight=1)

btn_decrease = tk.Button(master=window, text="-")
btn_decrease.grid(row=0, column=0, sticky="nsew")

lbl_value = tk.Label(master=window, text="0")
lbl_value.grid(row=0, column=1)

btn_increase = tk.Button(master=window, text="+")
btn_increase.grid(row=0, column=2, sticky="nsew")

window.mainloop()

Resultado:

Layout interativo Tkinter - command

Com o layout do aplicativo definido, você pode dar vida a ele dando alguns command aos botões. Comece com o botão esquerdo. Quando este botão é pressionado, ele deve diminuir o valor no rótulo em 1. Há duas coisas que você precisa saber como fazer para fazer isso:

  • Como obter o texto em um label?
  • Como atualizar o texto em um label?

Os widgets Label não têm .get( ) como os widgets de Entry e Text. No entanto, é possível obter o texto do label acessando o atributo text com uma notação subscrita no estilo dicionário. Exemplo:

label = Tk.Label(text="Hello")

# Retrieve a Label's text
text = label["text"]

# Set new text for the label
label["text"] = "Good bye"

Para aumentar e diminuir um valor de texto do label, iremos criar duas funções increase( ) e decrease( ), que serão incluídas no código após a importação do Tkinter no código com os botões, atribuindo as funções aos botões btn_increase e btn_decrease, respectivamente, utilizando command:

def increase():
    value = int(lbl_value["text"])
    lbl_value["text"] = f"{value + 1}"

def decrease():
    value = int(lbl_value["text"])
    lbl_value["text"] = f"{value - 1}"

Isso é tudo que você precisa fazer para vincular os botões para increase( ) e decrease( ) e tornar o programa funcional e interativo. Tente salvar suas alterações e executar o aplicativo! Clique nos botões para aumentar e diminuir o valor no centro da janela.

Código completo da aplicação com a atribuição dos botões de aumentar e diminuir o valor numérico:

import tkinter as tk

def increase():
    value = int(lbl_value["text"])
    lbl_value["text"] = f"{value + 1}"


def decrease():
    value = int(lbl_value["text"])
    lbl_value["text"] = f"{value - 1}"

window = tk.Tk()

window.rowconfigure(0, minsize=50, weight=1)
window.columnconfigure([0, 1, 2], minsize=50, weight=1)

btn_decrease = tk.Button(master=window, text="-", command=decrease)
btn_decrease.grid(row=0, column=0, sticky="nsew")

lbl_value = tk.Label(master=window, text="0")
lbl_value.grid(row=0, column=1)

btn_increase = tk.Button(master=window, text="+", command=increase)
btn_increase.grid(row=0, column=2, sticky="nsew")

window.mainloop()

Agora que já conhece todo o básico de como criar um layout interativo Tkinter, deixe sua imaginação fluir e crie suas aplicações!

Cursos de Programação -> Veja também: [+] 4 Dicas de Como Escolher Os Melhores Cursos de Programação.

Curso de Programação -> Veja também: [+] Pacote Full Stack para Iniciantes em Programação.

Curso para Desenvolvimento de Games -> Veja também: [+] Curso completo de Desenvolvimento de Games

Curso de Python para iniciantes ->  Veja também: [+] Pacote Python Faixa preta para iniciantes.


Deixe o seu comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *