Python代码学习笔记2

"""
Implement a GUI for viewing and updating class instances stored in a shelve;
the shelve lives on the machine this script runs on, as 1 or more local fiels;
"""
from tkinter import *
from tkinter.messagebox import showerror
import shelve
shelvename = 'class-shelve'
fieldnames = ('name', 'age', 'job', 'pay')
def makeWidgets():
    global entries
    window = Tk()
    window.title('People Shelve') #对话框的标题为'People Shelve'
    form = Frame(window) #Frame是tkinter中的一个class
    form.pack()
    entries = {}
    for (ix, label) in enumerate(('key',) + fieldnames):
        lab = Label(form, text=label)
        ent = Entry(form)
        lab.grid(row=ix, column=0)
        ent.grid(row=ix, column=1)
        entries[label] = ent
    Button(window, text="Fetch", command=fetchRecord).pack(side=LEFT)
    Button(window, text="Update", command=updateRecord).pack(side=LEFT)
    Button(window, text="Quit", command=window.quit).pack(side=RIGHT)
    return window

def fetchRecord():
    key = entries['key'].get()
    try:
        record = db[key]
    except:
        showerror(title='Error', message='No such key!')
    else:
        for field in fieldnames:
            entries[field].delete(0, END)
            entries[field].insert(0, repr(getattr(record, field)))

def updateRecord():
    key = entries['key'].get()
    if key in db:
        record = db[key]
    else:
        from person import Person
        record = Person(name='?', age='?')
    for field in fieldnames:
        setattr(record, field, eval(entries[field].get()))
    db[key] = record

db = shelve.open(shelvename)
window = makeWidgets()
window.mainloop()
db.close()

这段代码来自于Mark Lutz 的《Programming Python》Example 1-29

Shelves 是一种文件,这种文件可以存储任何python对象,并且可以通过key来读取。相当于dictionary,但是比dictionary多了open和close两种call。

代码中定义了三个函数:makeWidgets();fetchRecord();updateRecord()。

makeWidgets()
用到了很多tkinter中的class,像是Frame,Label,Entry。这些都是用来实现对话框的。
enumerate()的作用是生成一个带有序号的list。代码中(’key’,)+fieldnames实际效果是(’key’,’name’,’age’,’job’,’pay’),enumerate((’key’,’name’,’age’,’job’,’pay’))生成的list是[(0,’key’),(1,’name’),(2,’age’),(3,’job’),(4,’pay’)]
因为这个程序一开始的背景是存储几个人的信息,包括姓名,年龄,工作,工资。entries是存储每个人的信息形式,像是存入新的一个人的信息或者显示一个人的信息都是通过entries来完成的,所以在三个函数中都需要用到,所以entries的适用范围是全局。
fetchRecord()
用来通过key查找是否有值
updateRecord()
用来添加一个人的信息或者更新原有的数据,

from person import Person

这里的person是之前的例子,Person是其中的一个class。

setattr(record, field, eval(entries[field].get()))
#等价于record.field = entries[field].get()

这个eval的作用没太明白。

这里写图片描述
在key中输入tom,由于没有这个人的信息所以点击fetch会显示错误,在下面四个输入框中填入内容,点击update,就新存储了一个人的信息。
这里写图片描述
清空name,age,job,pay的内容
这里写图片描述
点击fetch,会显示这个人的信息
这里写图片描述
这个例子中个人信息的输入输出用的是相同的对话框。

这个例子只是在跟书练习,要说实际意义好像也不是太大,这种gui的话用VB来实现会相当简单,程序中用tkinter,其中好多class,我感觉不是那么好用,因为我可能根本不知道有这种class,如果读文档的话太费事。

提几个问题,望有经验的前辈指教。
1、现在除了官网的IDLE还有别的开发环境是用3.x版的吗?Enthought是python2.7,python(x,y)好像也是python2.x版的。
2、在官网的IDLE中用help的时候,碰到内容少的还好,碰上内容多的,直接显示到最后,想要看help的内容的用法得翻到最上面,好麻烦呀,有没有什么方法可以解决这种问题的。
3、博客中的代码怎么显示行数呀?引用代码段的时候显示不出代码。
4、有些英文单词的翻译总是找不到对应的中文,显示这个例子中,数据通过shelve存储,但是真不知道这个shelve该怎么翻译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值