#7.1 GUI与面向对象
#7.2 抽象
#类的定义:
class ClassName(object):
class_suite
#定义一个空类
class MyDate(object):
pass
#类的方法定义:
>>>class Dog(object):
def greet(self):
print("Hi!")
#实例的创建
>>>dog=Dog()
>>>dog.greet()
实例的创建——通过调用类对象
①定义类—Dog
②创建一个实例—dog
③通过实例使用属性或方法--dog.greet
#实例属性
class Dog(object):#定义类
def setName(self, name):
self.name=name
def greet(self):
print("Hi,I am called %s."% self. name)
if _name==' main:
dog=Dog()
dog.setName("Paul") #设置名字
dog.greet()
#初始化 init()
#类属性
·类的数据属性(静态成员)仅仅是所定义的类的变量
·在类创建后被使用
·可以由类中的方法来更新,也可以在主程序中更新
·类属性和实例无关,修改类属性需要使用类名
#7.3继承
父类->子类
#定义子类:Python和C++支持多继承
class SubClassName(ParentClass1[, ParentClass2,.…J):
class suite
#子类的定义与重载:
class Dog(object):
"define Dog class"
counter=0 def_init(self, name):
self.name=name
Dog.counter+=1 def greet(self):
print("Hi,I am %s, my number is %d"%
(self. name, Dog. counter))
class BarkingDog (Qog):#定义子类
def greet(self):#初始化子类
print("Woof!I am %s, my number is %d"%(self. name, Dog. counter)) if _name=='main':
dog=BarkingDog("Zoe")
dog. greet()
#私有属性和方法
·默认情况下,Python类的成员属性与方法都是“public"
·提供“访问控制符"来限定成员函数的访问
-双下划线()
_var属性会被_classname_var替换,将防止父类与子类中的同名冲突
-单下划线()
在属性名前使用一个单下划线字符,防止模块的属性用
“from mymodule import*"来加载
#7.4 GUI基本框架
安装wxPython:使用 pip install wxpython
#创建一个简单的wxPython程序:
import wx #导入包
app=WX.App() #创建应用程序对象
frame=wx. Frame(None, title="Hello, World!") #创建框架
frame. Show(True) #显示窗体
app. MainLoop()#进入事件循环
#组件
·组件容器(Containers)——用于容纳其它组件
-例:wx.Pane等
·动态组件(Dynamic Widgets)——可以被用户编辑
-例:wx.Button、wx.TextCtrl、wx.ListBox等
·静态组件(Static Widgets)——显示信息用,不能被用户编辑
-例:wx.StaticBitmap、wx.StaticText、wx.StaticLine等
·其它组件
-例:wx.ToolBar、wx.MenuBar、wx.StatusBar
#在窗体输出Hello World!
import wx class Frame1(wx. Frame):
def__init_(self superior):
wx. Frame._init_(selfparent=superior, title="Example", pos= (100,200), size=(350,200))
panel=wx. Panel(self)
text1=wx. TextCtrlI(panel, value="Hello, World!", size=(350,200))
if _name==' main:
app=wx. App()
frame=Frame1(None)
frame. Show(True)
app. MainLoop()
#事件处理机制(Event Handling)
1.GUI程序工作的基本机制之一——事件处理
2.事件
-移动鼠标,按下鼠标左键、单击按钮等
-可以由用户操作触发产生,也可以在程序中创建对象产生
3.wxPython程序将特定类型的事件关联到特定的一块代码(方法),当该类型的事件产生时,相关代码将响应事件被自动执行
-例:当产生鼠标移动事件时,OnMove)方法将被自动调用
#7.5 GUI常用组件
按钮(Button及其家族)
·功能:接受用户的点击事件,触发相应的操作。
·常用按钮:
-wx.Button:文本按钮
-wx.BitmapButton:位图按钮
-wx.ToggleButton:开关按钮
·绑定处理按钮点击的事件
#菜单(Menu及其组件)
·菜单
-菜单栏
-菜单
-菜单项命令
·wxPython用于创建菜单的类:
-wX.MenuBar
-wx.Menu
-wx.Menultem
#静态文本(StaticText)和文本框(TextCtrl)
·文本框用于接收用户在框内输入的信息,或显示由程序提供的信息
·静态文本框(标签):
-类:wx.StaticText
·文本框:
-类:wx.TextCtrl
-常用形式:单行,多行,富文本框
#列表(ListCtrl)
·列表用于显示多个条目并且可供用户选择
·列表能够以下面四种不同模式建造:
-WX.LC_ICON(图标)
-WX.LC_SMALL_ICON(小图标)
-WX.LC_LIST(列表)
-WX.LC_REPORT(报告)
#单选(RadioBox)与复选框(CheckBox)
·复选框用于从一组可选项中,同时选中多个选项
·对应的,单选框用于从一组互斥的选项中,选取其一
import wx
class Frame1(wx. Frame):
def init (self, superior):
wx. Frame._init_(self, parent=superior, title="Hello World in wxPython")
panel=wx. Panel(self)
sizer=wx. BoxSizer(Wx. VERTICAL)
self. text1=wx. TextCtrl(panel, value="Hello, World!", size=(200,180), style =Wx. TE_MULTILINE)
sizer. Add(self. text1,0, Wx. ALIGN TOPI Wx. EXPAND) button=wx. Button(panel, label="Click Me")
sizer. Add(button)
panel. SetSizerAndFit(sizer)
panel. Layout()
self. Bind(Wx. EVT_BUTTON, self. OnClick, button)
def OnClick(self, text):
self. text1. Append Text("\nHello, World!")
#7.6布局管理
1.绝对定位-每个窗口部件被创建时可以显式地指定它的位置和大小
-缺点:定位不灵活
-调整大小困难
-受设备、操作系统甚至字体影响
2.灵活布局的解决方案-sizer
-每个sizer有自己的定位策略
-开发者只需要选择合适策略的sizer将窗口组件放入,并指定好需求即可
#sizer:不是一个容器或一个窗口部件。它只是一个屏幕布局的算法
·sizer允许嵌套
·wxPython常用的sizer
-wx.BoxSizer
-wx.FlexGridSizer
-wx.GridSizer
-wx.GridBagSizer
-wx.StaticBoxSizer
使用步骤:
1.创建自动调用尺寸的容器,例如panel
2.创建sizer
3.创建子窗口(窗体部件)
4.使用sizer的Add0方法将每个子
5.窗口添加给sizer调用容器的SetSizer(sizer)方法
#7.7其他GUI库
PyQt:
·是Python语言的GUI编程解决方案之一
·提供了GPL与商业协议两种授权方式,可以免费地用于自由软件的开发
·跨平台:可以运行于Microsoft Windows、Mac OSX、Linux以及其它类Unix平台上
优点:
·文档比其他GUI库丰富
·与Qt、C++开发经验互通
·可使用大多数为Qt开发的组件
·有方便的周边工具支持PyQt,如QtDesigner,Eric4
缺点:
·要注意避免内存泄露
·运行时庞大
·需要学习一些C++知识
Tkinter:(Python的IDLE)
·Tkinter绑定了Python的TkGUI工具集,通过内嵌在Python 解释器内部的Tcl 解释器实现
·Tkinter的调用转换成Tcl 命令,然后交给Tcl解释器进行解释,实现Python的GUI界面
优点:
·历史最悠久,是Python事实上的标准GUI
·Python中使用TkGUI工具集的标准接口,已包括在标准的Python Windows安装中
·著名的IDLE用Tkinter 实现GUI
·创建的GUI简单,学起来和用起来也简单
缺点:
·性能不太好,执行速度慢
NPyGTK:
·PyGTK是一套GTK+GUI库的Python封装
·pyGTK为创建桌面程序提供了一套综合的图形元素和其它使用的编程工具·PyGTK是基于LGPL协议的免费软件·许多Gnome下的著名应用程序的GUI都是使用PyGTK实现的,比如BitTorrent,GlMP和Gedit 都有可选的实现
优点:
·底层的GTK+提供了各式的可视元素和功能
·能开发在GNOME桌面系统运行的功能完整的软件
缺点:
·在Windows平台表现不太好