Created
August 27, 2012 20:58
-
-
Save calmez/3492164 to your computer and use it in GitHub Desktop.
Programming Python (Mark Lutz / 4th Edition / O'Reilly) – Examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/python3 | |
""" | |
Implementation of persons for a pim database | |
""" | |
import shelve | |
import tkinter | |
import tkinter.messagebox | |
DEFAULT_SHELVE_NAME = 'people' | |
class Person: | |
""" | |
gerneral Person class | |
""" | |
def __init__(self, name, age, pay=0, job=None): | |
self.name = name | |
self.age = age | |
self.pay = pay | |
self.job = job | |
def __str__(self): | |
properties = [] | |
for prop in self.__dict__: | |
properties.append('%s: %s' % (prop, self.__dict__[prop])) | |
return ('<%s => %s>' % | |
(self.__class__.__name__, '; '.join(properties))) | |
def last_name(self): | |
return name.split()[-1] | |
def give_raise(self, percent): | |
self.pay *= (1.0 + percent) | |
def key(self): | |
return self.name.replace(' ', '_') | |
def save_to(self, shelve_name): | |
db = shelve.open(shelve_name) | |
db[self.key()] = self | |
db.close() | |
def save(self): | |
self.save_to(DEFAULT_SHELVE_NAME) | |
@classmethod | |
def load_from(cls, shelve_name, key): | |
db = shelve.open(shelve_name) | |
result = db[key] | |
db.close() | |
return result | |
@classmethod | |
def load(cls, key): | |
return cls.load_from(DEFAULT_SHELVE_NAME, key) | |
class Manager(Person): | |
""" | |
Manager class that has special give_raise method | |
""" | |
def __init__(self, name, age, pay, employees=2): | |
Person.__init__(self, name, age, pay, 'manager') | |
self.employees = employees | |
def give_raise(self, percent, bonus): | |
Person.give_raise(self, percent + bonus) | |
class PersonCUI: | |
""" | |
console interface for persons | |
""" | |
def start(self): | |
while True: | |
key = input('\nkey? => ') | |
if not key: | |
break | |
try: | |
record = Person.load(key) | |
except: | |
print('No such key "%s"!' % key) | |
else: | |
for field in record.__dict__.keys(): | |
current_value = getattr(record, field) | |
new_value = input('\t[%s]=%s\n\tnew?=>' % | |
(field, current_value)) | |
if new_value: | |
setattr(record, field, eval(new_value)) | |
record.save() | |
class PersonGUI(tkinter.Frame): | |
""" | |
graphical interface for persons | |
""" | |
def __init__(self, parent=None): | |
tkinter.Frame.__init__(self, parent) | |
self.form = tkinter.Frame(self) | |
self.entries = {} | |
self.key_list = tkinter.Listbox(self) | |
self.key_list.insert(0, 'NEW') | |
db = shelve.open(DEFAULT_SHELVE_NAME) | |
for key in db.keys(): | |
self.key_list.insert(tkinter.END, key) | |
self.key_list.pack(side=tkinter.TOP) | |
for (idx, string_label) in enumerate(Person('?', 0).__dict__.keys()): | |
label = tkinter.Label(self.form, text=string_label) | |
entry = tkinter.Entry(self.form) | |
label.grid(row=idx, column=0) | |
entry.grid(row=idx, column=1) | |
self.entries[string_label] = entry | |
fetch_button = tkinter.Button(self, text='Fetch', | |
command=(lambda: self.fetch( | |
self.key_list.get(self.key_list.curselection())))) | |
update_button = tkinter.Button(self, text='Update', | |
command=(lambda: self.update( | |
self.key_list.get(self.key_list.curselection())))) | |
self.form.pack() | |
fetch_button.pack(side=tkinter.LEFT) | |
update_button.pack(side=tkinter.LEFT) | |
def fetch(self, key): | |
try: | |
record = Person.load(key) | |
except: | |
tkinter.messagebox.showerror(title='Error!', | |
message='No such key "%s"!' % key) | |
else: | |
for field in record.__dict__.keys(): | |
self.entries[field].delete(0, tkinter.END) | |
self.entries[field].insert(0, repr(getattr(record, field))) | |
def update(self, key): | |
new = False | |
try: | |
record = Person.load(key) | |
except: | |
record = Person('?', 0) | |
new = True | |
for field in record.__dict__.keys(): | |
setattr(record, field, eval(self.entries[field].get())) | |
if new: | |
self.key_list.insert(tkinter.END, record.key()) | |
record.save() | |
if __name__ == '__main__': | |
#PersonCUI().start() | |
window = tkinter.Tk() | |
window.title('PeopleDB') | |
form = PersonGUI(window) | |
form.pack() | |
window.mainloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment