very simple tkinter demo program

max(01)* max2 at fisso.casa
Sat Apr 9 17:30:46 EDT 2005


hello.

i wrote a very simple tkinter demo program that uses menus, buttons, 
labels, entries, frames and secondary toplevels.

it is a python version of a java program made by a colleague.

the user can create ("Scrivi") a record with his second name, first name 
and date of birth, save ("Salva") the record to a file or read in 
("Leggi") a previously created file. "Annulla" is to cancel. "Chiudi" is 
to close.

i also used try-except for checking for invalid files.

only one menu is real ("File"), the others are for future use.

i'd like to hear your suggestions and comments for improving it.

i recently learned tkiner from stephen ferg's website and reading the 
tk8.4 widget demo programs.

one thing i still cannot do is to make the primary window and the 
secondary aware of each other (so avoid that a second instance of a 
secondary window can be generated if an instance still exists, for example).

so, here it is folks:

---cut here---

from Tkinter import *

class MiaApp:
   def __init__(self, genitore):

     self.MioGenitore = genitore

     fonte = ("Helvetica", "12")

     self.campi = ["Cognome", "Nome" , "Data di nascita"]

     quadro_grande = Frame(genitore)
     quadro_grande.pack(expand = YES, fill = BOTH)

     quadro_menu = Frame(quadro_grande)
     quadro_menu.configure(
       bd = 1,
       relief = RAISED
       )
     quadro_menu.pack(side = TOP, fill = X)

     pm_file = Menubutton(quadro_menu)
     pm_file.configure(text = "File")
     pm_file.pack(side = LEFT)

     m_file = Menu(pm_file)
     pm_file.configure(menu = m_file)
     m_file.configure(tearoff = NO)
     m_file.add_command(
       label = "Scrivi",
       command = self.premuto_scrivi
       )
     m_file.add_command(
       label = "Leggi",
       command = self.premuto_leggi
       )
     m_file.add_separator()
     m_file.add_command(
       label = "Chiudi",
       command = genitore.destroy
       )

     pm_mod = Menubutton(quadro_menu)
     pm_mod.configure(text = "Modifica")
     pm_mod.pack(side = LEFT)

     pm_aiuto = Menubutton(quadro_menu)
     pm_aiuto.configure(text = "?")
     pm_aiuto.pack(side = RIGHT)

     msg = Label(quadro_grande)
     msg.configure(
       font = fonte,
       relief = RIDGE,
       wraplength = "10c",
       justify = LEFT,
       text = u"Questo \u00E8 un programma in Python \
che trae ispirazione da un analogo lavoro del collega \
G. Renda. Il programma originale era scritto \
in linguaggio Java, e sfruttava le librerie JFC \
(\u00ABJava Foundation Class\u00BB, dette anche \
\u00ABSwing\u00BB); questo invece usa le librerie Tk, \
mediante il modulo Tkinter."
       )
     msg.pack(
       side = TOP,
       padx = "2m",
       pady = "2m"
       )

     quadro_pulsanti = Frame(quadro_grande)
     quadro_pulsanti.pack(
       side = BOTTOM,
       fill = X,
       padx = "2m",
       pady = "2m"
       )

     scrivi = Button(quadro_pulsanti)
     scrivi.configure(
       text = "Scrivi",
       command = self.premuto_scrivi
       )
     scrivi.pack(side = LEFT, expand = YES)

     leggi = Button(quadro_pulsanti)
     leggi.configure(text = "Leggi", command = self.premuto_leggi)
     leggi.pack(side = LEFT, expand = YES)

     chiudi = Button(quadro_pulsanti)
     chiudi.configure(text = "Chiudi", command = genitore.destroy)
     chiudi.pack(side = LEFT, expand = YES)

   def premuto_scrivi(self):
     InserimentoRecord()

   def premuto_leggi(self):
     ConsultazioneRecord()

class InserimentoRecord(Toplevel):
   def __init__(self):

     Toplevel.__init__(self)

     self.titolo = "Inserimento"
     self.wm_title(self.titolo)

     quadro_grande = Frame(self)
     quadro_grande.pack(expand = YES, fill = BOTH)

     self.quadro_pulsanti = Frame(quadro_grande)
     self.quadro_pulsanti.pack(
       side = BOTTOM,
       fill = X,
       padx = "2m",
       pady = "2m"
       )

     quadri_ing = []
     self.n = len(miaApp.campi)
     self.var = []
     eti = []
     larg_eti = max(map(len, miaApp.campi))
     ing = []
     for i in range(self.n):
       quadri_ing.append(None)
       self.var.append(None)
       ing.append(None)
       eti.append(None)
       quadri_ing[i] = Frame(quadro_grande)
       quadri_ing[i].pack(side = TOP, expand = YES, fill = BOTH)
       self.var[i] = StringVar()
       eti[i] = Label(quadri_ing[i])
       eti[i].configure(
	text = miaApp.campi[i] + ": ",
	width = larg_eti,
	anchor = E
	)
       eti[i].pack(side = LEFT, pady = 5, padx = 10, fill = X)
       ing[i] = Entry(quadri_ing[i], textvariable = self.var[i])
       ing[i].pack(side = LEFT, pady = 5, padx = 10, fill = X)

     self.salva = Button(self.quadro_pulsanti)
     self.salva.configure(
       text = "Salva",
       command = self.premuto_salva
       )
     self.salva.pack(side = LEFT, expand = YES)

     self.annulla = Button(self.quadro_pulsanti)
     self.annulla.configure(
       text = "Annulla",
       command = self.premuto_annulla
       )
     self.annulla.pack(side = LEFT, expand = YES)

   def premuto_salva(self):
     import tkFileDialog
     import pickle

     dati = []
     for i in range(self.n):
       dati.append(None)
       dati[i] = self.var[i].get()

     nomefile = tkFileDialog.asksaveasfilename(
       defaultextension = ".ana",
       filetypes = [
	("Record anagrafici", "*.ana"),
	("Tutti i file", "*")
	]
       )

     if nomefile:
       f = open(nomefile, "w")
       pickle.dump(dati, f)
       f.close()

     self.destroy()

   def premuto_annulla(self):
     self.destroy()

class ConsultazioneRecord(Toplevel):
   def __init__(self):

     import tkFileDialog

     nomefile = tkFileDialog.askopenfilename(
       defaultextension = ".ana",
       filetypes = [
	("Record anagrafici", "*.ana"),
	("Tutti i file", "*")
	]
       )

     if nomefile:

       try:  ### Il metodo 'pickle.load' potrebbe generare una
	    ### eccezione se l'utente cerca di aprire un file
	    ### non del formato giusto

	Toplevel.__init__(self)

	self.titolo = "Consultazione"
	self.wm_title(self.titolo)

	quadro_grande = Frame(self)
	quadro_grande.pack(expand = YES, fill = BOTH)

	eti_rec = Label(quadro_grande)
	eti_rec.configure(
	  text = "Record: " + nomefile,
	  relief = RIDGE
	  )
	eti_rec.pack(
	  side = TOP,
	  fill = X,
	  padx = "5m",
	  pady = "5m"
	  )

	self.quadro_pulsanti = Frame(quadro_grande)
	self.quadro_pulsanti.pack(
	  side = BOTTOM,
	  fill = X,
	  padx = "2m",
	  pady = "2m"
	  )

	import pickle

	quadri_eti = []
	eti_campi = []
	eti_val = []
	larg_eti_campi = max(map(len, miaApp.campi))
	f = open(nomefile, "r")

	valori = pickle.load(f)  ### Potrebbe generare una
				 ### eccezione 'KeyError'

	larg_eti_val = max(map(len, valori))
	n = len(miaApp.campi)
	for i in range(n):
	  quadri_eti.append(None)
	  eti_campi.append(None)
	  eti_val.append(None)
	  quadri_eti[i] = Frame(quadro_grande)
	  quadri_eti[i].pack(side = TOP, expand = YES, fill = BOTH)
	  eti_campi[i] = Label(
	    quadri_eti[i],
	    text = miaApp.campi[i] + ": ",
	    width = larg_eti_campi,
	    anchor = E
	    )
	  eti_campi[i].pack(side = LEFT, pady = 5, padx = 10, fill = X)
	  eti_val[i] = Label(
	    quadri_eti[i],
	    text = valori[i],
	    anchor = W,
	    width = larg_eti_val,
	    relief = SUNKEN
	    )
	  eti_val[i].pack(side = LEFT, pady = 5, padx = 10, fill = X)
	self.chiudi = Button(self.quadro_pulsanti)
	self.chiudi.configure(
	  text = "Chiudi",
	  command = self.premuto_chiudi
	  )
	self.chiudi.pack(side = LEFT, expand = YES)

       except KeyError:  ### Eventualmente generato da
			### 'pickle.load()'

	import tkMessageBox

	tkMessageBox.showwarning(
	  "Bad input",
	  "Illegal values, please try again"
	  )
         self.destroy()

       f.close()

   def premuto_chiudi(self):
     self.destroy()

radice = Tk()
radice.wm_title("Versione Python di un programma Java di G. Renda")
radice.wm_iconname("giuseppe")
radice.minsize(400, 300)
miaApp = MiaApp(radice)
radice.mainloop()



More information about the Python-list mailing list