very simple tkinter demo program

M

max(01)*

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 = Frame(quadro_grande)
quadri_ing.pack(side = TOP, expand = YES, fill = BOTH)
self.var = StringVar()
eti = Label(quadri_ing)
eti.configure(
text = miaApp.campi + ": ",
width = larg_eti,
anchor = E
)
eti.pack(side = LEFT, pady = 5, padx = 10, fill = X)
ing = Entry(quadri_ing, textvariable = self.var)
ing.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 = self.var.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 = Frame(quadro_grande)
quadri_eti.pack(side = TOP, expand = YES, fill = BOTH)
eti_campi = Label(
quadri_eti,
text = miaApp.campi + ": ",
width = larg_eti_campi,
anchor = E
)
eti_campi.pack(side = LEFT, pady = 5, padx = 10, fill = X)
eti_val = Label(
quadri_eti,
text = valori,
anchor = W,
width = larg_eti_val,
relief = SUNKEN
)
eti_val.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()
 
S

Samantha

I can not get it to run.
S
max(01)* said:
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 = Frame(quadro_grande)
quadri_ing.pack(side = TOP, expand = YES, fill = BOTH)
self.var = StringVar()
eti = Label(quadri_ing)
eti.configure(
text = miaApp.campi + ": ",
width = larg_eti,
anchor = E
)
eti.pack(side = LEFT, pady = 5, padx = 10, fill = X)
ing = Entry(quadri_ing, textvariable = self.var)
ing.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 = self.var.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 = Frame(quadro_grande)
quadri_eti.pack(side = TOP, expand = YES, fill = BOTH)
eti_campi = Label(
quadri_eti,
text = miaApp.campi + ": ",
width = larg_eti_campi,
anchor = E
)
eti_campi.pack(side = LEFT, pady = 5, padx = 10, fill = X)
eti_val = Label(
quadri_eti,
text = valori,
anchor = W,
width = larg_eti_val,
relief = SUNKEN
)
eti_val.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()
 
D

Daniel Bickett

max(01)* said:
i also used try-except for checking for invalid files.
[...]

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

Without actually reading your code, if I may, I would suggest using
the os module to confirm that a file exists rather than waiting for an
error to be thrown.
# this has the twofold purpose of:
# 1) making sure the path exists, and
# 2) making sure the path is a file
print "Error!"


Error!
 
M

max(01)*

Samantha said:
I can not get it to run.
S

sorry about that. baybe it is a conflict between tabstop width in my
editor and in my newsreader.

i substituted tabs with spaces and i hope now you can run it.

bye

macs

----cuthere----

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 = Frame(quadro_grande)
quadri_ing.pack(side = TOP, expand = YES, fill = BOTH)
self.var = StringVar()
eti = Label(quadri_ing)
eti.configure(
text = miaApp.campi + ": ",
width = larg_eti,
anchor = E
)
eti.pack(side = LEFT, pady = 5, padx = 10, fill = X)
ing = Entry(quadri_ing, textvariable = self.var)
ing.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 = self.var.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 = Frame(quadro_grande)
quadri_eti.pack(side = TOP, expand = YES, fill = BOTH)
eti_campi = Label(
quadri_eti,
text = miaApp.campi + ": ",
width = larg_eti_campi,
anchor = E
)
eti_campi.pack(side = LEFT, pady = 5, padx = 10, fill = X)
eti_val = Label(
quadri_eti,
text = valori,
anchor = W,
width = larg_eti_val,
relief = SUNKEN
)
eti_val.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()
 
S

Samantha

Thanks that worked.
S
max(01)* said:
Samantha said:
I can not get it to run.
S

sorry about that. baybe it is a conflict between tabstop width in my
editor and in my newsreader.

i substituted tabs with spaces and i hope now you can run it.

bye

macs

----cuthere----

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 = Frame(quadro_grande)
quadri_ing.pack(side = TOP, expand = YES, fill = BOTH)
self.var = StringVar()
eti = Label(quadri_ing)
eti.configure(
text = miaApp.campi + ": ",
width = larg_eti,
anchor = E
)
eti.pack(side = LEFT, pady = 5, padx = 10, fill = X)
ing = Entry(quadri_ing, textvariable = self.var)
ing.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 = self.var.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 = Frame(quadro_grande)
quadri_eti.pack(side = TOP, expand = YES, fill = BOTH)
eti_campi = Label(
quadri_eti,
text = miaApp.campi + ": ",
width = larg_eti_campi,
anchor = E
)
eti_campi.pack(side = LEFT, pady = 5, padx = 10, fill = X)
eti_val = Label(
quadri_eti,
text = valori,
anchor = W,
width = larg_eti_val,
relief = SUNKEN
)
eti_val.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()
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,733
Messages
2,569,439
Members
44,829
Latest member
PIXThurman

Latest Threads

Top