GUI con TKinter: pack e griglia con bottoni e combobox

Un altro esempio di uso di TKinter. Qui invece di usare la griglia si è scelto il sistema automatico “pack”. Se la grafica è semplice può tornare utile per snellire il codice da scrivere

import tkinter

#inizializziamo globalmente la finestra
window = tkinter.Tk() 
window.geometry("500x500")
window.title("GUI con TkInter!")
# window.resizable(False, False)
# window.configure(background="white")


#creiamo un raggruppamento
gruppo = tkinter.LabelFrame(window, text="Anagrafica", padx=5, pady=5)
gruppo.pack(padx=10, pady=10, side=tkinter.LEFT)

'''
al nostro gruppo aggiungiamo qualche campo
questa volta non faccio una griglia ma lascio adattare alla finestra
usando il metodo pack. Se non dobbiamo fare disposioni particolari, spesso basta
'''
primariga = tkinter.Frame(gruppo)
primariga.pack(fill=tkinter.X)

nome = ''
labelNome= tkinter.Label(primariga, text='Nome:')
labelNome.pack(fill=tkinter.X, side=tkinter.LEFT)
widgetNome= tkinter.Entry(primariga, textvariable=nome)
widgetNome.pack(fill=tkinter.X, side=tkinter.LEFT)

cognome = ''
labelNome= tkinter.Label(primariga, text='Cognome:')
labelNome.pack(fill=tkinter.X, side=tkinter.LEFT)
widgetNome= tkinter.Entry(primariga, textvariable=cognome)
widgetNome.pack(side=tkinter.LEFT, fill=tkinter.X, expand=1)


secondariga = tkinter.Frame(gruppo)
secondariga.pack(fill=tkinter.X, pady=5)

cf = ''
labelCF= tkinter.Label(secondariga, text='C.F.:')
labelCF.pack(fill=tkinter.X, side=tkinter.LEFT)
widgetCF= tkinter.Entry(secondariga, textvariable=cf)
widgetCF.pack(side=tkinter.LEFT,fill=tkinter.X)

anniAttivita = 0
labelAnniAttivita= tkinter.Label(secondariga, text='Anni attività:')
labelAnniAttivita.pack(fill=tkinter.X, side=tkinter.LEFT)
widgetAnniAttivita= tkinter.Entry(secondariga, textvariable=anniAttivita)
widgetAnniAttivita.pack(side=tkinter.LEFT)


#creo un nuovo frame per andare a capo dal primo
rigasotto = tkinter.Frame(window)
rigasotto.pack(padx=10, pady=10, side=tkinter.LEFT)

#creiamo un raggruppamento
gruppodue = tkinter.LabelFrame(rigasotto, text="Famiglia", padx=5, pady=5)
gruppodue.pack(padx=10, pady=10, side=tkinter.LEFT)

padre = ''
labelPadre= tkinter.Label(gruppodue, text='Padre:')
labelPadre.grid(row=0, column=0)
widgetPadre= tkinter.Entry(gruppodue, textvariable=padre)
widgetPadre.grid(row=0, column=1)

madre = ''
labelMadre= tkinter.Label(gruppodue, text='Madre:')
labelMadre.grid(row=1, column=0)
widgetMadre= tkinter.Entry(gruppodue, textvariable=padre)
widgetMadre.grid(row=1, column=1)

if __name__ == "__main__":
    window.mainloop() 

Il sistema di inserimento delle label fatto in questo modo non tiene conto dell’allineamento dei campi, il che risulta poco piacevole da vedere in molti casi. Esistono parametri che possono essere passati alla label per effettuare il wrap e il giustificato ma sono scomodi da usare a mio avviso. Vediamo un altro esempio più semplice per allineare gli oggetti a mezzo della  griglia. Nello stesso esempio abbiamo fatto qualche modifica per vedere come aggiungere le textarea, le combobox e i bottoni con le funzioni scatenate al loro click

from tkinter import *
from tkinter import messagebox
from tkinter import ttk

def cmdInvia():
    messagebox.showinfo("Messaggio", "Facciamo progressi")

#inizializziamo globalmente la finestra
window = Tk()
window.geometry("480x220")
window.title("GUI con TkInter!")


gruppo = LabelFrame(window, text="Anagrafica", padx=5, pady=5, width=300)
gruppo.grid(row=0, sticky='W', padx=5, pady=5, ipadx=5, ipady=5)

Label(gruppo, text="Nome:").grid(row=0, sticky=W)
Label(gruppo, text="Cognome:").grid(row=1, sticky=W)
Label(gruppo, text="Città:").grid(row=2, sticky=W)
Label(gruppo, text="Commenti:").grid(row=3, sticky=W)

txtNome     = Entry(gruppo)
txtCognome  = Entry(gruppo)
citta = ["Teramo", "L'Aquila", "Pescara", "Chieti"]
cmbCitta = ttk.Combobox(gruppo, values=citta)
txtCommenti = Text(gruppo, height=2, width=30)
txtCommenti.insert(END, "Questo è un placeholder\ncon andata a capo\n")

txtNome.grid(row=0, column=1, sticky=W)
txtCognome.grid(row=1, column=1, sticky=W)
cmbCitta.grid(row=2, column=1, sticky=W)
txtCommenti.grid(row=3, column=1)

cmdInvia    = Button(window, text='Invio', command=cmdInvia)
cmdEsci     = Button(window, text='Esci', command=window.quit)

cmdInvia.grid(row=3, column=2, sticky=S+E)
cmdEsci.grid(row=3, column=3, sticky=S+E)


if __name__ == "__main__":
    window.mainloop()

Ultima modifica 21 Febbraio 2022