Tkinter – Interface gráfica para programas em Python 3


Aqui no Caderno já tivemos contato com diversas bibliotecas que facilitam a implementação de interfaces gráficas com o usuário. Vimos o wxPython, passamos pelo Kivy e outros. Não é fácil definir qual seria “A” biblioteca ideal, pois cada uma apresenta vantagens e desvantagens. Um dos pontos que consideramos importante é a facilidade de migração entre os sistemas operacionais (no mínimo Linux, Windows e Mac) e a integração com as linguagens Python ou C++, que são as linguagens que mais utilizamos no dia a dia. E além disto, é importante que sejam código livre, sem custos de aquisição ou distribuição.

Nesta série vamos conversar sobre o Tkinter, ou Tk interface. Esta biblioteca  acompanha as distribuições Python.  Tk foi desenvolvida como uma biblioteca de interface para a linguagem Tcl. Ambos tiveram bastante sucesso na década de 90. Mas o Tk se mostrou tão fácil de aprender e utilizar que se firmou independente da linguagem Tcl. E foi  interfaceado com diferentes linguagens, tais como Python (chamado de Tkinter, ou Tk INTERface), Ada (chamada de Tash), Ruby, Lisp e Perl.

Estamos utilizando o Linux Mint 13, e o Python 2.7. O editor é o Geany. É importante você conhecer o Python e orientação por objetos para compreender os exemplos a seguir.

 

Instalando a biblioteca

digite no terminal o comando sudo apt-get install  python-tk.

Nesta data a versão instalada foi a 2.7.5

Um teste rápido se está tudo instalado corretamente

Copie o texto a seguir para o arquivo exp1.py:

#!/usr/bin/env/python
# -*- coding: utf-8 -*-

from Tkinter import *	#importa a bibioteca gráfica

root = Tk()             #cria a aplicação raiz. É uma janela com barra de título, botão para
                        #fechar,aumentar, etc.. Deve ser sempre o primeiro objeto a ser criado, 
                        # e deve ser único em uma aplicação

w = Label(root, text="Tudo bem até aqui!")    #cria um label com o texto especificado
w.pack()                                      #insere na tela

root.mainloop()                               #inicializa o loop

Abra um terminal e execute o programa acima através do comando python exp1.py. O resultado deve ser algo como:

Com isto já sabemos que tudo o que iremos precisar já está instalado. Em caso de erro veja as mensagens emitidas pelo sistema e corrija de acordo com as mesmas. Em caso de dúvida envie uma msg para que possamos ajudá-lo.

 

Uma visão geral do TkInter

Objetos de interface disponíveis no Tkinter

Na sua versão mais simples, a que já vem com a distribuição Python, temos os seguintes elementos (widgets) disponíveis:

button canvas checkbutton combobox entry frame
label labelframe listbox menu menubutton message
notebook optionMenu panedwindow progressbar radiobutton scale
scrollbar separator sizegrip spinbox text treeview

Diálogos disponíveis no Tkinter

Temos um conjunto de diálogos disponíveis, gerados com um mínimo esforço de codificação

chooseColor chooseDirectory dialog getOpenFile
getSaveFile messageBox popup toplevel

Posicionamento dos objetos na tela

Se você é leitor do Caderno, deve-se lembrar que os objetos na tela podiam ser posicionados através de “sizers”, nas bibliotecas que estudamos até aqui. No caso do Tkinter a situação é um pouco mais simples.

place : posicionamento em posições absolutas grid: posiciona os objetos numa grade virtual na tela pack: posiciona os objetos acima ou ao lado relativos um ao outro

 

Experimentando com o Tkinter

Vamos aprender a utilizar esta biblioteca através de exemplos. Neste primeiro caso vamos desenvolver um programa que, a ser pressionado um botão, gera de forma aleatória seis números para jogar na Mega-sena. Para os leitores não brasileiros: A Mega-sena é um jogo de loteria gerenciada pelo governo brasileiro, onde o objetivo é acertar seis dezenas dentro de 60 disponíveis.  Os valores dos prêmios são bem grandes. Se vocẽ ganhar com este programa, por favor  dedique uma parte ao financiamento de programas de software livre 🙂

 

Passo1: Criando a  classe de aplicação e a inserindo num loop tkinter

Embora não estritamente necessário, (como bem mostra o exemplo acima), é sempre interessante criarmos uma classe de aplicação. Isto permite o encapsulamento de dados que facilita a manutenção quando o programa começa a crescer.

Crie o programa com o código a seguir e o denomine mega1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  megasena.py
#  
#  Copyright 2017 Tavares <tavares@tavares-Inspiron-5558>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
#  

import Tkinter

class megaSenaApp_tk(Tkinter.Tk):
# Tkinter.tk é a classe base para a janela padrão. A nossa classe megaSenaApp_tk irá herdar todas as funcionalidades da classe padrão.

	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
        # no construtor da nossa classe, apenas chamamo o construtor da classe pai, Tkinter.Tk.__init__()).
		self.parent = parent
        # geralmente necessitaremos  de acessar o pai de um objeto. É uma boa técnica  sempre salvar uma referencia ao pai.
		self.initialize()
		#no método initialize criamos os demais objetos que serão apresentados na tela, inicializamos as variáveis globais (irc..), 
		           #inicializamos o hardware caso necessário, etc..
		
		
	def initialize(self):    #no momento ainda não inicializamos nada
		pass         


#este é ponto onde o programa se inicia
#se foi chamado a partir do interpretador python, o _name_  automaticamente será "__main__"
if __name__ == "__main__":
	app = megaSenaApp_tk(None)      #criamos uma aplicação sem enhum pai, pois é a principal.
	app.title('Minha Mega-Sena')    #especificamos o título de nossa aplicação
	app.mainloop()                  #o programa entra no loop de espera de eventos (pressionar de menus, botões, etc..)
	

Execute este programa através da linha de comando:

python mega1.py. A seguinte tela deve aparecer:

Se o título “minha mega-sena não estiver completo, abra mais a janela arrastando suas bordas, como é convencional com programas gráficos. Veja que toda a funcionalidade básica de uma janela gráfica foi herdada da classe tkinter.tk. Não tivemos que escrever uma única linha de código para implementar as funções gráficas.

Chegamos ao nosso auto limite de 1000 palavras. Até o nosso próximo encontro.

 

 


Deixe um comentário

3 pensamentos em “Tkinter – Interface gráfica para programas em Python

  • Portinho

    Olá, estou acompanhando este caderno e verifiquei que apesar de fazer exatamente conforme descrito no script acima, o erro abaixo aparece.
    Segue a versão do Python que estou usando, além de fazer os exercícios no Windows.

    Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32
    Type “copyright”, “credits” or “license()” for more information.
    >>> ================================ RESTART ================================
    >>>
    Traceback (most recent call last):
    File “C:/Python34/Tkinter_teste.py”, line 3, in
    class megaSenaApp_tk(Tkinter.Tk):
    NameError: name ‘Tkinter’ is not defined
    ================================
    Obrigado pela ajuda.
    Abraços

    • tavares Autor do post

      Isto aconteceu porque você esta usando o Python 3.4 e o código a que se refere foi escrito para o Python 2.7. Se você substituir o import por “import tkinter …” , em minúsculo, a biblioteca será encontrada.

      Mas esta não é a única diferença entre as versões 2.7 e 3.x. Para atenuar o problema sempre informamos qual a versão do Python e do sistema operacional no qual o experimento foi realizado. De uns 3 meses para cá temos utilizado sempre a versão Python 3.5. A não ser que venhamos a encontrar alguma biblioteca que exija o 2.7, iremos focar nesta versão e superiores, quando liberadas.

      Solução mais simples: Use o python 2.7 para executar.

      Solução mais adequada: Migre todo o código para o Python 3.x, e nos envie o mesmo com autorização para atualizarmos o post segundo o seu código. Claro que os créditos da atualização estarão bem claros no post! Seus colegas que estão iniciando agradecem. 🙂

      Abs

      Roberto