Python GUI与面向对象
Python面向对象
- 对象是数据与其能实施的操作的封装结构
- 类是对于实例对象的抽象
类的定义
class clickButton(object):
'define a clickButton'
# 类名就是一个命名空间namespace
def Dog(self):
# 类方法第一个参数为self
print 'Hi'
实例的创建
# 创建实例直接使用构造方法
button = clickButton()
# 使用实例方法只需要用实例名.
button.Dog()
类的init()方法
# __init__()方法即构造方法,该方法会被创建对象时自动调用
def __init__(self,name):
self.name = name
类的静态属性
# 类属性要用类名.变量名 使用
class Dog(pbject):
counter = 0 # 静态属性
def __init__(self,name):
self.name = name
Dog.counter+=1
def greet(self):
print 'Hi'
继承的思想
# Python属于多继承
class subClass(parentClass1[,parentClass2···]):
pass
# 子类可以重写父类的方法
GUI开发
wxPython库
第一个实例
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import wx
class MyApp(wx.App):
def OnInit(self):
frame = wx.Frame(None, title='HelloWorld')
frame.Show() #Show()函数首字母大写
return True
if __name__ == '__main__':
app = MyApp()
app.MainLoop()
wxPython库中的组件,与java中的组件基本上相同
组件.jpg# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import wx
class MyFrame(wx.Frame):
def __init__(self,superior):
wx.Frame.__init__(self,parent=superior,title='Example',pos=(100,200),size=(200,100))
panel = wx.Panel(self)
text = wx.TextCtrl(panel,value='HelloWorld',size=(200,100))
if __name__=='__main__':
app = wx.App()
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
运行结果:
运行结果.jpg事件响应
示例代码
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import wx
class MyFrame(wx.Frame):
def __init__(self,superior):
wx.Frame.__init__(self,parent=superior,title='Example',pos=(100,200),size=(200,100))
self.panel = wx.Panel(self)
self.panel.Bind(wx.EVT_LEFT_UP,self.OnClick)
def OnClick(self,event):
posm = event.GetPosition()
wx.StaticText(parent=self.panel,label='HI',pos=(posm.x,posm.y))
if __name__=='__main__':
app = wx.App()
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
响应事件运行结果:
响应事件运行结果.jpg常用的组件
- wx.Button 普通按钮
- wx.BitmapButton 位图按钮
- wx.ToggleButton 开关按钮,按下去会长关或者常开
- wx.MenuBar、wx.Menu、wx.MenuItem(绑定的按钮事件为
self.Bind(wx.EvT_MENU,self.OnClickQuit,quitItem)
) - wx.StaticText 标签,静态文本框
- wx.TextCtrl 文本框
- wx.RadioBox
- wx.CheckBox
sizer布局管理
sizer本身不是一个容器或者窗口,它是一个屏幕布局的算法
wxPython 使用的sizer:
- wx.BoxSizer 平行或垂直布局
- wx.FlexGridSizer 行高和列宽由本行、列最大的组件决定
- wx.GridSizer 所有组件大小一致,固定在一个方向
sizer示意图
sizer示意.jpgsizer的例程
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import wx
class MyFrame(wx.Frame):
def __init__(self,superior):
wx.Frame.__init__(self,parent=superior,title='Example')
self.panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.text1 = wx.TextCtrl(self.panel,value='HelloWorld',size=(200,180),style=wx.TE_MULTILINE)
self.sizer.Add(self.text1,0,wx.ALIGN_TOP|wx.EXPAND)
self.button = wx.Button(self.panel,label = 'Click Me')
self.sizer.Add(self.button)
self.panel.SetSizerAndFit(sizer=self.sizer)
self.panel.Layout()
self.panel.Bind(wx.EVT_BUTTON,self.OnClick)
def OnClick(self,event):
self.text1.AppendText('\nHelloWorld')
if __name__=='__main__':
app = wx.App()
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
运行结果
sizer结果.jpg其它的GUI库
PyQt 跨平台,文档丰富,与Qt、C++开发经验互通,但是运行时较为庞大,要注意内存
TKinter 内置于Python中,性能较差,运行慢
PyGTK 免费,windows表现不好
网友评论