python GUI编程

来源:互联网 发布:高频交易软件系统 编辑:程序博客网 时间:2024/05/17 05:55
摘要:本章,我们来学习python的图形界面编程。在python中,默认的图形界面是Tkinter(interface)——注意,k是小写的。


1.编程环境与运行原理

        如果你使用的是python3.0以前的版本,默认是没有安装图形界面的。你需要使用yum或者apt来安装tkinter,它是python的默认GUI库,基于Tk工具集,最初是为工具命令语言(Tcl)设计的。
        GUI编程是一种C/S架构,没法脱离窗口系统,其中窗口是服务器,我们的GUI是客户机。

        创建并运行GUI的过程如下:
1)导入Tkinter模块
2)创建顶层串口对象top(名字不限),容纳整个GUI程序
3)在top上创建其他模块
4)将这些GUI模块与底层代码关联
5)进入主循环事件

       Tkinter.Tk()返回的窗口是根窗口,一般命名是root或者top。我们可以创建多个顶层窗口(其他所有的组件都放在这个窗口之中),但是只有一个root。
       组件既可以是独立的,也可以作为容器存在,作为容器的时候,他就是容器中组件的父组件。
       组件会有一定的行为和动作:按钮被按下、进度条被拖动、文本框被写入,这些用户行为是“事件”,针对事件的相应动作称为“回调函数”(callback)。用户操作,产生事件,然后相应的callback执行,整个过程被称为事件驱动,很显然,我们需要定义callback函数。
        界面编程的工作主要有三个:组件的创建与布局,组件间动作的关联,回调函数的处理

2.Tk组件


2.1顶层窗口

import Tkinter
top=Tkinter.Tk()

2.2其他组件

目前Tk共有15种组件:
Button:按钮,类似标签,提供额外的功能:鼠标掠过、按下、释放、键盘操作
Canvas:画布,提供绘图功能
checkbutton:选择按钮,可以选择任意个
Entry:文本框
Frame:框架,包含其他组件的纯容器
label:注意,不是lable
listbox:列表框
menu:菜单
menubutton:菜单按钮
message:消息框,可以显示多行文本
radiobuttonscale:单选按钮
scrollbar:滚动条——对其支持的组件(文本框、画布、列表框、文本区域)提供滚动功能
text:文本区域
scale:进度条
toplevel:顶级,类似框架,提供一个单独的容器。

    对GUI编程的学习,一个很重要的方面就是各个控件的学习,包括属性,常用方法等。

3.一个GUI程序的设计和实施实例

3.1功能设计:

我们设计一个这样的程序,给定目录,能够显示目录下的文件;

双击目录,能够显示这个目录下的文件;
可以通过滚动条,查看不再视觉区域内部的文件;

3.2界面设计:


3.3逻辑设计:

1)事件设计
点击clear:清楚listbox中的所有内容
点击quit:退出
点击list:列出选中的目录下的内容;如果没有选中目录,不进行处理;如果选中的是文件,不进行任何处理
在文本框中输入路径:判断路径是否合法;如果是目录,list it
双击listbox中的文件或者文件夹:列出目录下的内容
拖动滚动条:显示listbox下的文件

2)回调函数的定义
clrdir():clear listbox
doLs():list the given dir

3.4相关代码

#!/usr/bin/env python# encoding: utf-8import osfrom time import sleepfrom Tkinter import *class DirList(object):def __init__(self,initdir=None):""" """self.top=Tk()self.title_label=Label(self.top,text="Directory Lister V1.1")self.title_label.pack()self.cwd=StringVar(self.top)self.cwd_lable=Label(self.top,fg='blue',font=('Helvetica',12,'bold'))self.cwd_lable.pack()self.dirs_frame=Frame(self.top)self.sbar=Scrollbar(self.dirs_frame)self.sbar.pack(side=RIGHT,fill=Y)self.dirs_listbox=Listbox(self.dirs_frame,height=15,width=50,yscrollcommand=self.sbar.set)self.dirs_listbox.bind('<Double-1>',self.setDirAndGo)self.dirs_listbox.pack(side=LEFT,fill=BOTH)self.dirs_frame.pack()self.dirn=Entry(self.top,width=50,textvariable=self.cwd)self.dirn.bind("<Return>",self.doLS)self.dirn.pack()self.bottom_frame=Frame(self.top)self.clr=Button(self.bottom_frame,text="Clear",command=self.clrDir,activeforeground='white',activebackground='blue')self.ls=Button(self.bottom_frame,text="LS",command=self.doLS,activeforeground='white',activebackground='blue')self.quit=Button(self.bottom_frame,text="Quit",command=self.top.quit,activeforeground='white',activebackground='blue')self.clr.pack(side=LEFT)self.ls.pack(side=LEFT)self.quit.pack(side=LEFT)self.bottom_frame.pack()if initdir:self.cwd.set(os.curdir)self.doLS()def clrDir(self,ev=None):#self.cwd.set('')self.dirs_listbox.delete(first=0,last=END)def setDirAndGo(self, ev=None):"""pass:ev: @todo:returns: @todo"""self.last=self.cwd.get()self.dirs_listbox.config(selectbackground='red')check=self.dirs_listbox.get(self.dirs_listbox.curselection())if not check:check=os.curdir#check is the selected item for file or directoryself.cwd.set(check)self.doLS()def doLS(self,ev=None):error=""self.cwd_lable.config(text=self.cwd.get())tdir=self.cwd.get()#get the current working directoryif not tdir:tdir=os.curdirif not os.path.exists(tdir):error=tdir+':no such file'elif not os.path.isdir(tdir):error=tdir+":not a directory"if error:#if error occuredself.cwd.get(error)self.top.update()sleep(2)if not (hasattr(self,'last') and self.last):self.last=os.curdirself.cwd.set(self,last)self.dirs_listbox.config(selectbackground='LightSkyBlue')self.top.update()returnself.cwd.set("fetching dir contents")self.top.update()dirlist=os.listdir(tdir)dirlist.sort()os.chdir(tdir)self.dirs_listbox.delete(0,END)self.dirs_listbox.insert(END,os.curdir)self.dirs_listbox.insert(END,os.pardir)for eachfile in dirlist:self.dirs_listbox.insert(END,eachfile)self.cwd.set(os.curdir)self.dirs_listbox.config(selectbackground='LightSkyBlue')def main():d=DirList(os.curdir)mainloop()if __name__ == '__main__':main()


0 0
原创粉丝点击