Exemplo usando Python e Tkinter


Definição da Interface


É possível com algum estudo sobre Tkinter, fazer este programa sem o uso de qualquer RAD (rapid application development) para GUI (graphical user interface), pois o programa só utiliza 3 widgets (um label e dois radioButton). Entretanto a idéia aqui é mostrar além do uso do Tkinter, o uso do GUI Builder.

  • No menu inicial, escolha a linguagem Python + Tk 8.4.
  • Ao abrir a tela de desenvolvimento, coloque dois frames, um em cima do outro.
  • No frame de cima, clique na sua borda superior para dividí-lo ao meio.
  • No sub-frame superior, coloque o _radiobutton_1, texto "Little Hello", variável opcaoTamanho, value=1, e stick todo o quadrado (nsew).
  • Faça o mesmo para o sub-frame abaixo deste, com o _radiobutton_2, texto "Big Hello", e o resto idêntico. Importante: o nome da variável dos radiobuttons que estão agrupados deve ser o mesmo. Neste caso opcaoTamanho também.
  • No frame de baixo, coloque o _label_1, texto "Little Hello World", fonte gothic 9, e stick para todo lado (nsew).

GUIBuilder-HelloWorld.png

  • Salve sua aplicação com o nome helloGUI.ui.
  • O GUI Builder irá salvar 3 arquivos: helloGUI.ui, que é uma descrição da janela, o helloGUI_ui.py é o código em Python para gerar a janela, e o helloGUI.py que é o código que você irá alterar para incluir as suas funções.

helloGUI.ui: arquivo que descreve a janela em linguagem do GUI Builder.

# GUIBUILDER FILE Build 146
# Created: 2008-11-07 21:53:05 by GUI Builder Build 146
language tkinter 8.4
widget {Tk frame} f {
    geometry min_column {40 40}
    geometry min_row {40 40}
    geometry pad_column {0 0}
    geometry pad_row {0 0}
    geometry resize_column {0 0}
    geometry resize_row {0 0}
    geometry weight_column {0 0}
    geometry weight_row {0 0}
    data GROUP Tk
    data ID {}
    data MASTER {}
    data TYPE {Tk frame}
    data level 0
}
widget {Tk frame} _frame_1 {
    geometry -column 1
    geometry -columnspan 2
    geometry -row 1
    geometry -rowspan 1
    geometry -sticky news
    geometry min_column 40
    geometry min_row {40 40}
    geometry pad_column 0
    geometry pad_row {0 0}
    geometry resize_column 0
    geometry resize_row {0 0}
    geometry weight_column 0
    geometry weight_row {0 0}
    data GROUP Tk
    data ID _frame_1
    data MASTER {}
    data TYPE {Tk frame}
    data level 1
}
widget {Tk label} _label_1 {
    configure -font {gothic 9}
    configure -text {Little Hello World}
    geometry -column 1
    geometry -columnspan 2
    geometry -row 2
    geometry -rowspan 1
    geometry -sticky nsew
    geometry min_column 40
    geometry min_row {40 40}
    geometry pad_column 0
    geometry pad_row {0 0}
    geometry resize_column 0
    geometry resize_row {0 0}
    geometry weight_column 0
    geometry weight_row {0 0}
    data GROUP Tk
    data ID _label_1
    data MASTER {}
    data TYPE {Tk label}
}
widget {Tk radiobutton} _radiobutton_1 {
    configure -anchor w
    configure -text {Little Hello}
    configure -value 1
    configure -variable opcaoTamanho
    geometry -column 1
    geometry -columnspan 1
    geometry -row 1
    geometry -rowspan 1
    geometry -sticky nsew
    geometry min_column 40
    geometry min_row {40 40}
    geometry pad_column 0
    geometry pad_row {0 0}
    geometry resize_column 0
    geometry resize_row {0 0}
    geometry weight_column 0
    geometry weight_row {0 0}
    data GROUP Tk
    data ID _radiobutton_1
    data MASTER _frame_1
    data TYPE {Tk radiobutton}
}
widget {Tk radiobutton} _radiobutton_2 {
    configure -anchor w
    configure -text {Big Hello}
    configure -value 0
    configure -variable opcaoTamanho
    geometry -column 1
    geometry -columnspan 1
    geometry -row 2
    geometry -rowspan 1
    geometry -sticky nsew
    geometry min_column 40
    geometry min_row {40 40}
    geometry pad_column 0
    geometry pad_row {0 0}
    geometry resize_column 0
    geometry resize_row {0 0}
    geometry weight_column 0
    geometry weight_row {0 0}
    data GROUP Tk
    data ID _radiobutton_2
    data MASTER _frame_1
    data TYPE {Tk radiobutton}
}

Código Python


helloGUI_ui.py: classe com a janela em python. Não edite este arquivo, ou suas alterações serão perdidas caso precise modificar a janela no GUI Builder.

""" helloGUI_ui.py --
 
 UI generated by GUI Builder Build 146 on 2008-11-07 21:53:05 from:
    /home/beco/Documents/fontes/python/Hello-World-Tkinter/helloGUI.ui
THIS IS AN AUTOGENERATED FILE AND SHOULD NOT BE EDITED.
The associated callback file should be modified instead.
"""
 
import Tkinter
import os # needed for relative image paths
 
# Using new-style classes: create empty base class object
# for compatibility with older python interps
#if sys.version_info < (2, 2):
#    class object:
#        pass
 
class HelloGUI(object):
    _images = [] # Holds image refs to prevent GC
    def __init__(self, root):
        self.opcaoTamanho = Tkinter.StringVar(root)
 
        # Widget Initialization
        self._frame_1 = Tkinter.Frame(root,
        )
        self._label_1 = Tkinter.Label(root,
            font = "gothic 9",
            text = "Little Hello World",
        )
        self._radiobutton_1 = Tkinter.Radiobutton(self._frame_1,
            anchor = "w",
            text = "Little Hello",
            value = 1,
            variable = self.opcaoTamanho,
        )
        self._radiobutton_2 = Tkinter.Radiobutton(self._frame_1,
            anchor = "w",
            text = "Big Hello",
            value = 1,
            variable = self.opcaoTamanho,
        )
 
        # widget commands
 
        self._radiobutton_1.configure(
            command = self._radiobutton_1_command
        )
        self._radiobutton_2.configure(
            command = self._radiobutton_2_command
        )
 
 
        # Geometry Management
        self._frame_1.grid(
            in_    = root,
            column = 1,
            row    = 1,
            columnspan = 2,
            ipadx = 0,
            ipady = 0,
            padx = 0,
            pady = 0,
            rowspan = 1,
            sticky = "news"
        )
        self._label_1.grid(
            in_    = root,
            column = 1,
            row    = 2,
            columnspan = 2,
            ipadx = 0,
            ipady = 0,
            padx = 0,
            pady = 0,
            rowspan = 1,
            sticky = "nsew"
        )
        self._radiobutton_1.grid(
            in_    = self._frame_1,
            column = 1,
            row    = 1,
            columnspan = 1,
            ipadx = 0,
            ipady = 0,
            padx = 0,
            pady = 0,
            rowspan = 1,
            sticky = "nsew"
        )
        self._radiobutton_2.grid(
            in_    = self._frame_1,
            column = 1,
            row    = 2,
            columnspan = 1,
            ipadx = 0,
            ipady = 0,
            padx = 0,
            pady = 0,
            rowspan = 1,
            sticky = "nsew"
        )
 
 
        # Resize Behavior
        root.grid_rowconfigure(1, weight = 0, minsize = 40, pad = 0)
        root.grid_rowconfigure(2, weight = 0, minsize = 40, pad = 0)
        root.grid_columnconfigure(1, weight = 0, minsize = 40, pad = 0)
        root.grid_columnconfigure(2, weight = 0, minsize = 40, pad = 0)
        self._frame_1.grid_rowconfigure(1, weight = 0, minsize = 40, pad = 0)
        self._frame_1.grid_rowconfigure(2, weight = 0, minsize = 40, pad = 0)
        self._frame_1.grid_columnconfigure(1, weight = 0, minsize = 40, pad = 0)

helloGUI.py: seu programa. Modifique apenas nas seções indicadas para isso: seção de variáveis globais e cada def.

#!/usr/bin/env python
""" helloGUI.py --
 
 UI generated by GUI Builder Build 146 on 2008-11-07 21:53:05 from:
    /home/beco/Documents/fontes/python/Hello-World-Tkinter/helloGUI.ui
 This file is auto-generated.  Only the code within
    '# BEGIN USER CODE (global|class)'
    '# END USER CODE (global|class)'
 and code inside the callback subroutines will be round-tripped.
 The 'main' function is reserved.
"""
 
from Tkinter import *
from helloGUI_ui import HelloGUI
 
# BEGIN USER CODE global
#File helloGUi.py by Beco, 07/11/2008
#Hello World Example using Tkinter and python 2.5.2
 
# END USER CODE global
 
class CustomHelloGUI(HelloGUI):
    pass
 
    # BEGIN CALLBACK CODE
    # ONLY EDIT CODE INSIDE THE def FUNCTIONS.
 
    # _radiobutton_1_command --
    #
    # Callback to handle _radiobutton_1 widget option -command
    def _radiobutton_1_command(self, *args):
      self._label_1.config(font="gothic 9", text="Little Hello World")
 
    # _radiobutton_2_command --
    #
    # Callback to handle _radiobutton_2 widget option -command
    def _radiobutton_2_command(self, *args):
      self._label_1.config(font="gothic 14", text="Big Hello World")
 
    # END CALLBACK CODE
 
    # BEGIN USER CODE class
 
    # END USER CODE class
 
def main():
    # Standalone Code Initialization
    # DO NOT EDIT
    try: userinit()
    except NameError: pass
    root = Tk()
    demo = CustomHelloGUI(root)
    root.title('helloGUI')
    try: run()
    except NameError: pass
    root.protocol('WM_DELETE_WINDOW', root.quit)
    root.mainloop()
 
if __name__ == '__main__': main()

Com essa pequena edição você já tem pronto o programa Hello World! Faça um teste.

GUIBuilder-Tkinter-Hello-World-Kate.png



Nota: por algum bug no GUI Builder, as duas primeiras linhas do helloGUI.py ficam coladas assim:

#!/usr/bin/env python""" helloGUI.py --

Simplesmente dê um enter entre python e as aspas, para que fique correta:

#!/usr/bin/env python
""" helloGUI.py --

O problema é que a cada execução do GUI Builder, como essa área está fora da área permitida para edição, o problema retorna e deve ser corrigido novamente! A versão do GUI Builder que uso é a "Build 146" de novembro de 2006.



Nota sobre o Py3k: basta trocar o Tkinter maiúsculo pelo tkinter minúsculo em todo o código, que deve funcionar.