扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年2月27日
关键字:
保存会话间的数据
做了这些以后,我们的程序就可以用了,但是当我们关闭程序后,所以的易事贴都会消失——我们可以通过保存列表的内容到一个文件中,同时在程序运行的时候下载它来安装这个程序。为实现这个我们将使用pickle模块——Python的系列版本,或者使用集结待发的数据类型到文件中。首先我们需要输入模块:
import pickle
然后我们得到一个变量,易事贴,这个变量包含了易事贴列表。为了将它保存到一个文件中,我们仅仅需要打开文件写入,并使用dump函数。你可能会注意到第三个按钮的回叫信号是空的,让我们来改变它以便将当前的易事贴列表保存到文件中:
def Save():
f = file("notes.db", "wb")
notes = listbox.get(0, END)
pickle.dump(notes, f)
现在,当按下“保存”按钮,我们可以在桌面上得到我们的易事贴的副本。这个不会给我们太多的帮助,除非我们有一些下载这些易事贴的方法,所以让我们在启动主循环前正确地把列表框填满:
try:
f = file("notes.db", "rb")
notes = pickle.load(f)
for item in notes:
listbox.insert(END,item)
f.close()
except:
pass
我们需要用一个try语句将所有的东西捆绑起来,以防文件打开抛出一个异常,也就是说,如果文件“notes.db”不存在的话,应该抛出一个异常,产生警告。然而,如果一个异常被抛出,我们不会真正的注意到它,我们只是仅仅不会下载任何易事贴到列表中而已。
这样,你有了一个用Python和Tk写的,不超过70行代码的,可运行的迷你易事贴程序——用键盘和鼠标输入来完成,并且可以下载和保存数据。使用这个,你能看到建立一个基于应用程序的快速GUI是多么简单的事情,但是这个程序只有少许的改进,比如,多线程文本区域,或者复制一个易事贴到剪贴版中,自动保存易事贴,等等,它对于保存你的踪迹到列表中来说,是一个恰当地唾手可得的方法。我将把这个作为一个练习留下来。如果你想找到更多的关于你能用Python在Tk做些什么的文挡,最好的地方是查看这里的库文件。如果你一直跟着做下来的话,程序应该看上去像下面这样:
下面是这个例子的代码:
#!/usr/bin/python
from Tkinter import *
import pickle
root = Tk()
root.geometry("600x400")
root.title("Note Taker")
def Enter():
text_contents = text.get()
listbox.insert(END, text_contents)
text.delete(0,END)
def Remove():
listbox.delete(ANCHOR)
def Save():
f = file("notes.db", "wb")
notes = listbox.get(0, END)
pickle.dump(notes, f)
def ReturnInsert(event):
Enter()
def DeleteCurrent(event):
Remove()
def CopyToText(event):
text.delete(0, END)
current_note = listbox.get(ANCHOR)
text.insert(0, current_note)
textframe = Frame(root)
listframe = Frame(root)
enter_button = Button(textframe, text="Enter", command = Enter)
remove_button = Button(textframe, text="Remove", command = Remove)
save_button = Button(textframe, text="Save", command = Save)
text = Entry(textframe)
scrollbar = Scrollbar(listframe, orient=VERTICAL)
listbox = Listbox(listframe, yscrollcommand=scrollbar.set, selectmode=EXTENDED)
scrollbar.configure(command=listbox.yview)
text.bind("<Return>", ReturnInsert)
listbox.bind("<Double-Button-3>", DeleteCurrent)
listbox.bind("<Double-Button-1>", CopyToText)
text.pack(side=LEFT, fill=X, expand=1)
enter_button.pack(side=LEFT)
remove_button.pack(side=LEFT)
save_button.pack(side=LEFT)
listbox.pack(side=LEFT,fill=BOTH, expand=1)
scrollbar.pack(side=RIGHT, fill=Y)
textframe.pack(fill=X)
listframe.pack(fill=BOTH, expand=1)
try:
f = file("notes.db", "rb")
notes = pickle.load(f)
for item in notes:
listbox.insert(END,item)
f.close()
except:
pass
root.mainloop()
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者