📚️ [TUTORIAL] Interface gráfica moderna para python com Tkinter
Introdução
Quando estudamos programação como iniciantes e não só tem sido difícil encontrar uma biblioteca/framework de Interface Gráfica de Utilizador (GUI) para prosseguirmos com nossos estudos. Para o caso dos utilizadores do Python ela já vem instalado com uma biblioteca para GUI o Tkinter (para windows e Mac OS, no caso do Linux é bem fácil é apenas um linha no terminal para instalar), o qual tem vários pontos fortes:
Multiplataforma, então o mesmo código funciona no Windows, macOS e Linux; elementos visuais são renderizados usando elementos nativos do sistema operacional, para que os aplicativos construídos pareçam pertencer à plataforma em que são executados.
fonte: Programadores Brasil
Para saber
Apesar de a própria documentação dizer que:
O Tkinter é famoso por ter uma aparência desatualizada.
É possível criar GUI bem modernas, cumprindo-se assim o ditado que diz que o problema nunca é a ferramente e sim quem a usa. Venho já há um tempo utilizando o Tkinter consegui chegar a uma qualidade de GUI que me alegrado por isso tenho muito gosto em partilhar e afirmo que não vejo melhor que está, para começar.
O uso do Tkinter fica bem interessante com o uso o ttk ou tkinter.ttk, com ele é possível separar os texto dos estílos e até estilizar várias partes da GUI com a mesma linha mais ou menos como CSS e HTML. O ttk evoluio tanto que existe o ttkbootstrap, e muitas outras com design fantástico.
Exemplos
Cara está tão interessante, a sintaxe é simples, as GUI são bem leves, multiplataforma, já estou a criar sistemas em OOP e MVC (sim, banco de dados), e até setup/instaladores para Windows e Linux. Criei alguns sistemas completos.
Meu cenário de desenvolvimento
- SO Linux Ubuntu 18.04
- Python 3.6
- Tkinter 8.6
A GUI que criei para ilustração é está:
Código fonte
# -*- coding: utf-8 -*-
from tkinter import Tk, PhotoImage
from tkinter import Entry as tkEntry
from tkinter.ttk import Frame, Label, Button, Entry, Separator, Style
'''
Title: Modern Interface for Python with Tkinter
by ngoma for Tabnews, 29.11.2022, Huambo-Angola
'''
# funcoes
def login():
et_email.delete(0, 'end')
et_senha.delete(0, 'end')
et_email.focus_force()
def nova_conta():
et_email.focus_force()
# primeira linha
root = Tk()
# frames
borda = Frame(root, style='Borda.TFrame')
borda.pack(fill='x', expand=True)
topo = Frame(borda)
topo.pack()
centro = Frame(borda)
centro.pack()
base = Frame(borda)
base.pack()
logo = PhotoImage(file=r'img/logo_d.png')
lb_logo = Label(topo, image=logo)
lb_logo.image = logo
lb_logo.pack()
Label(centro, text='E-mail').pack(anchor='w', pady=(10,0))
et_email = tkEntry(centro, font=('Montserrat', 12, 'bold'), fg='#666', relief='flat',
highlightbackground='white', highlightcolor='white')
et_email.focus_force()
et_email.pack(fill='x')
Separator(centro, orient='horizontal').pack(fill='x')
Label(centro, text='Senha').pack(anchor='w', pady=(10,0))
et_senha = tkEntry(centro, show='*', font=('Montserrat', 12, 'bold'), fg='#666', relief='flat',
highlightbackground='white', highlightcolor='white')
et_senha.pack()
Separator(centro, orient='horizontal').pack(fill='x', pady=(0,20))
Button(base, text='ENTRAR', command=login, cursor='hand1').pack(fill='x', pady=(0,10))
Label(base, text='Ainda não tens uma conta? ', style='Small.TLabel').pack(side='left')
Button(base, text='Crie agora.', command=nova_conta, cursor='hand1', style='Small.TButton').pack(side='left')
# fontes
Tfont = ('Montserrat ExtraBold', 22)
Pfont = ('Montserrat', 10)
Pfontb = ('Montserrat', 12, 'bold')
Sfont = ('Montserrat', 8)
# estilo
style = Style()
style.theme_use('default')
style.configure('TFrame', background='#fff')
style.configure('Borda.TFrame', width=300)
style.configure('TLabel', justify='right', font=Pfont, background='#fff', foreground='#808080')
style.configure('Small.TLabel', font=Sfont)
style.configure('TButton', padding=(60,7), font=Pfontb, foreground='#fff', background='#20bcbb', relief='')
style.configure('Small.TButton', padding=(0,-3), font=Sfont, width=0, height=0, foreground='#20bcbb', background='#fff', relief='')
style.configure('TSeparator', background='#bafafa')
style.map('TButton',
foreground=[('pressed', '#e25ca5'), ('active', '#fff')],
background=[('pressed', '!focus', '#3f8efc'), ('active', '#025b5a')],
relief=[('pressed', 'flat'), ('!pressed', 'flat')])
style.map('Small.TButton',
foreground=[('pressed', '#f3bb30'), ('active', '#025b5a')],
background=[('pressed', '!focus', '#3f8efc'), ('active', '#fff')],
relief=[('pressed', 'flat'), ('!pressed', 'flat')])
# ultimas linhas
root.title('Design moderno - tkinter')
root.geometry('400x550+100+100')
root.iconphoto(False, PhotoImage(file='img/logo_da.png'))
root.configure(bg='#fff')
root.mainloop()
O que acharam?