数据分析系列 之python中面向对象与GUI的设计

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析系列 之python中面向对象与GUI的设计相关的知识,希望对你有一定的参考价值。

1 面向对象的思想介绍
1.1 这部分可以类比于C++和java中类和对象的知识来进行学习;
1.2 类—描述对象的特征;对象—由数据和方法组成;
1.3 抽象的介绍:
类是对象的抽象,类的具体化是对象(模板),对象相当于类的具体实现;
python中_init_()方法介绍:
(a) 它是对象的初始化方法,当类被调用后,python将创建实例对象;
(b) 创建完对象后,python自动调用的第一个方法;
© 实例对象作为方法的第一个参数self被传递进去,调用类创建实例对象时的参数都传给_init_()。
1.4 继承的介绍:
父类—>基类,子类—>派生类;
举例:

class BMI:
	def_init_(self,height,weight):
		self.bmi = seight/height**2
	def printBMI(self):
		print("Your BMI is {:.1f}".format(self.bmi))

# ChinaBMI继承BMI,注意和C++和java写法的区别
class ChinaBMI(BMI):
# 重写printBMI()方法
	def printBMI(self):
		print("Your BMI is {:.1f}".format(self.bmi))
		if self.bmi < 18.5:
			print("......")
		elif self.bmi < 24:
			......

# 实例化
h = float(input("height="))
w = float(input("weight="))
CBMI = ChinaBMI(h , w)
CBMI.print()

2 GUI的设计
2.1 使用wxPython类库;
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple wxpython

2.2 组件:
组件容器(Containers):用于容纳其它组件,例如:wx.Panel;
动态组件(Dynamic Widgets):可以被用户编辑,例如:wx.Button、wx.TextCtrl、wx.ListBox等;
静态组件(Static Widgets):显示信息用,不能被用户编辑,例如:wx.StaticBitmap、wx.StaticText、wx.StaticLine等;
其它组件:例如wx.ToolBar、wx.MenuBar、wx.StatusBar等。

2.3 组件的放置关系:
Text Control < Panel < Frame

2.4 组件介绍:
按钮:wx.Button(文本按钮),wx.BitmapButton(位图按钮),wx.ToggleButton(开关按钮);
菜单:wx.MenuBar,wx.Menu,wx.MenuItem;
静态文本框:wx.StaticText;
文本框:wx.TextCtrl;
列表:wx.LC_ICON(图标),wx.LC_SMALL_ICON(小图标),wx.LC_LIST(列表),wx.LC_REPORT(报告);
单选框和复选框。

2.5 布局管理:
sizer—>定位策略;
wx.BoxSizer:两个方向;
wx.FlexGridSizer:灵活;
wx.GridSizer:网格布局。

2.6 其它的GUI库:
PyQt、Tkinter、PyGTK

2.7 举例:

# 窗体中抬起左键可以创建显示Hello World
import wx
# 创建SubFrame类,继承自wx.Frame
class SubFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self, parent=parent, title='Hello World', pos=(100, 200), size=(200, 100))
        self.panel = wx.Panel(self)
        #鼠标左键抬起时触发时间绑定带OnClick函数
        self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)
 
 # 定义鼠标响应事件:OnClick()
    def OnClick(self,event):
        posm=event.GetPosition()
        # 显示文本
        wx.StaticText(parent=self.panel,label='Hello World',pos=(posm.x,posm.y))
        
if __name__ == '__main__':
    app = wx.App()
    # 定义frame对象
    frame = SubFrame(None)
    frame.Show()
    app.MainLoop()

# 点击button输出一行hello world
import wx
class SubFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self, parent=parent, title='Hello World')
        self.panel = wx.Panel(self)
        # 垂直布局
        sizer=wx.BoxSizer(wx.VERTICAL)
        # 采用多行显示
        # 文本框:wx.TextCtrl
        self.text1=wx.TextCtrl(self.panel,value='Hello World\\n',style=wx.TE_MULTILINE)
        # 1为响应容器改变大小,expand占据窗口的整个宽度
        sizer.Add(self.text1,1,wx.ALIGN_TOP|wx.EXPAND)
        self.button=wx.Button(self.panel,label='click')
        self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)
        sizer.Add(self.button)
        self.panel.SetSizerAndFit(sizer)
        self.panel.Layout()
    # 响应button事件
    def OnClick(self,event):
        self.text1.AppendText('Hello World\\n')
        
if __name__ == '__main__':
    app = wx.App()
    frame = SubFrame(None)
    frame.Show()
    app.MainLoop()

# 输出单选按钮的内容到文本框
import wx
class SubFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self, parent=parent, title='Hello World',size=(300,300))
        self.panel = wx.Panel(self)
        lblList = ['First', 'Second', 'Third']
        self.rbox = wx.RadioBox(self.panel, label='RadioBox', pos=(0, 20), choices=lblList,majorDimension=1, style=wx.RA_SPECIFY_ROWS)
        self.rbox.Bind(wx.EVT_RADIOBOX, self.onRadioBox)
        self.button=wx.Button(self.panel,label='button',pos=(0,100))
        self.Bind(wx.EVT_BUTTON,self.onclick)       			                           	                  -       self.text1=wx.TextCtrl(self.panel,
        style=wx.TE_MULTILINE,
        pos=(0,150),size=(300,50))
 
    def onclick(self,event):
        self.text1.AppendText(self.rbox.GetStringSelection())
 
    def onRadioBox(self, e):
        print(self.rbox.GetSelection())
        
if __name__ == '__main__':
    app = wx.App()
    frame = SubFrame(None)
    frame.Show()
    app.MainLoop()

以上是关于数据分析系列 之python中面向对象与GUI的设计的主要内容,如果未能解决你的问题,请参考以下文章

python之基础篇——类与面向对象

自动化运维Python系列之面向对象

自动化运维Python系列之面向对象

Python学习系列之面向对象

1Python全栈之路系列之面向基础

Python系列之反射面向对象