very simple tkinter demo program

Samantha samantha7395 at hotmail.com
Sun Apr 10 00:36:41 EDT 2005


I can not get it to run.
S
"max(01)*" <max2 at fisso.casa> wrote in message 
news:aQX5e.1205416$35.44366592 at news4.tin.it...
> 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