JAVA 因简洁而美丽,因有效而动人 善待JAVA这颗种子的人,必将得到她的福荫

Python GUI

上一篇 / 下一篇  2013-10-03 21:42:20 / 个人分类:Python

python 图形界面 
转自:http://blog.163.com/benben_long/blog/static/1994582432012122376900/ 

2012-02-22 15:07:06|  分类: python代码 |字号 订阅
from Tkinter import *
root=Tk()
root.title("my test")
root.mainloop() #主循环
以上是建立一个空白的窗体
======================================

button1=Button(root,text="button1")
button2=Button(root,text="button2")
button3=Button(root,text="button3")
text = Entry(root)
listbox = Listbox(root)

button1.pack()
button2.pack()
button3.pack()
text.pack()
listbox.pack()
root.mainloop()

以上是在窗体中放置一些小的控件
=======================================
def Button1():
    listbox.insert(END, "button1 pressed")
def Button3():
    text_contents = text.get()
    listbox.insert(END, text_contents)
    text.delete(0,END)
button1 = Button(root, text="button1", command = Button1)
button3 = Button(root, text="button3", command = Button3)
以上是按button1和button3时会出现相应的操作,也就是各控件之间的交互.
===============================================

scrollbar = Scrollbar(root, rient=VERTICAL)
listbox = Listbox(root,yscrollcommand=scrollbar.set)
scrollbar.configure(command=listbox.yview)
scrollbar.pack()
当listbox满的时候,不会看到.加上滚动条后,可以看到.
=================================================


安置窗口小部件
将窗口分成两部分,一部分是文本框和按钮,另一部分控制列表框。将使用框架窗口小部件来实现这个功能,框架窗口小部件看上去像个容器,可以将其它的窗口小部件放在它的里面??就像根窗口一样。现在来创建一对框架
textframe. = Frame(root)

listframe. = Frame(root)

我们已经将每个窗口小部件的所有者都设置为根窗口,接下来,我们改变它的所有者并应用到我们的新设计中:
button1 = Button(textframe, text="button1", command = Button1)
button2=Button(textframe,text="button2")
button3 = Button(textframe, text="button3", command = Button3)
text = Entry(textframe)

scrollbar = Scrollbar(listframe, rient=VERTICAL)
listbox = Listbox(listframe,yscrollcommand=scrollbar.set)
scrollbar.configure(command=listbox.yview)

其 实,这样不会起太多作用,除非我们告诉Tk窗口小部件在框架中放置的位置,为实现这个我们可以使用包方法和三个关键字:side、fill和 expand。在文字处理器中你能把边认为与对准线相似,它告诉窗口小部件框架它们一般需要设置的哪一边,是顶部,底部,左边还是右边——默认的形式是群 围绕着中心这种方式。在这种情况下,除了用作左边对准器的滚动条外,我们需要将其它的每件东西用滚动条包围列表框的右边。

第 二个选项,fill,如果它增长了就告诉Tk哪个方向溢出了小窗口部件,在X轴方向(水平方向),Y轴方向(垂直方向)或者两个方向都有。一般来说,我们 能很好处理这些按钮,但是它希望文本框和列表框能使用尽量多的空间——所以设置文本框在X轴方向溢出和列表框在两个方向溢出——滚动条应该重新设置列表框 的大小,所以设置它在Y轴方向溢出。

最后,expand选项告诉窗口小部件如果可能是否要扩张到免费的空间——增加expand=1这条语句到文本框和列表框包选项中就能实现这个效果。现在,你的代码应该看上去像下面这样:

text.pack(side=LEFT, fill=X, expand=1)

button1.pack(side=LEFT)

button2.pack(side=LEFT)
button3.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)
==========================================================

键盘事件和鼠标事件
我 们有一些工作,或多或少的——但是它的界面一直有点不实用。如果我们能使用鼠标和键盘使事情更直接的话,这些工作看上去将会更容易处理。当你们运行Tk主 循环,在键盘上敲击一个键或者四处移动鼠标产生事件,你可以以同样的方法绑定回叫信号函数到按钮上,这样按钮被按下去的时候也会产生相应事件。现在我们已 经有个函数处理这样的情况了,那就是按钮3的回叫信号,但是不幸地是,我们现在还不能使用,因为按钮的事件回叫信号与鼠标和键盘不一样。我们必须把它限制 在其它的函数中:

def ReturnInsert(event):

Button3()

然后我们注册这些事件的回叫信号,并寻找使用绑定函数:

text.bind("<Return>", ReturnInsert)

这 里我们使用<Return>事件代码而不使用<Enter>事件代码,这点是非常重要的,因为当鼠标进入列表框时就会触发第二个 触发器。现在我们想让用户使用右击来从列表框中移动项目,对于相同的处理这种处理是相当棒的。首先我们写一个回叫信号作为输入来接收事件:

def DeleteCurrent(event):

listbox.delete(ANCHOR)

然后我们绑定事件到这个回叫信号上:

listbox.bind("<Double-Button-3>", DeleteCurrent)

鼠 标右键在Tk中被称为按钮-3(不要与我们第三个形式按钮回叫信号的名字混淆了),因为第二个鼠标按钮涉及到鼠标的中间键。最后,以防万一他们想修改它, 我们可以允许用户拷贝一个易事贴返回到文本框。我们没有一个函数能实现这个功能,所以我们将不得不在回叫信号中写一些新的代码:

def CopyToText(event):

text.delete(0,END)

current_note = listbox.get(ANCHOR)

text.insert(0, current_note)

然后像先前那样将事件绑定到回叫信号中:

listbox.bind("<Double-Button-1>", CopyToText)

你不仅仅可以限制这些事件,如果你想知道更多的关于哪些事件你能绑定的话,请查看Tk内部库介绍。

现 在看上去是整理我们程序的时候了。按钮1对于一个函数来说是一个不太好的名字——曾经有相似的名字使我们陷入困境,在这里我们就不要重蹈覆辙了。我们也有 机会改变一些按钮作用,比如,我们可以设置输入按钮来关闭文本框,按钮1没有特别的作用,所以我们可以除去它了。修改这些并没有真正地功能性改变,但是程 序现在看上去像这样:

#!/usr/bin/python

from Tkinter import *

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():

pass

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, rient=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)

root.mainloop()
===================================================

保存会话间的数据
可以通过保存列表的内容到一个文件中,同时在程序运行的时候下载它来安装这个程序。为实现这个我们将使用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”不存在的话,应该抛出一个异常,产生警告。然而,如果一个异常被抛出,我们不会真正的注意到它,我们只是仅仅不会下载任何易事贴到列表中而已。
#!/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("d:\\python-std\\notes.db","w")
    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, rient=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)


try:
    f=file("d:\\python-std\\notes.db","rb")
    notes=pickle.load(f)
    for item in notes:
        listbox.insert(END,item)
    f.close()
except:
    pass

textframe.pack(fill=X)
listframe.pack(fill=BOTH, expand=1)

root.mainloop()

TAG: GUI gui Python python

 

评分:0

我来说两句

Open Toolbar