python学习(5)

06_面向对象和图形用户界面

01_5-1面向对象

01_1-GUI与面向对象

# 图像用户界面GUI
def func():
    '''add function'''
    list1 = []
    print ('input a number')
    while 1:
        a = input()
        if a =='-':
            break
        list1.append(eval(a))#将字符串转成相应的对象(如list、tuple、dict和string之间的转换)
    sumList = sum(list1)
    return sumList
func()
input a number
1
2
3
-
6
help(eval)
Help on built-in function eval in module builtins:

eval(source, globals=None, locals=None, /)
    Evaluate the given source in the context of globals and locals.
    
    The source may be a string representing a Python expression
    or a code object as returned by compile().
    The globals must be a dictionary and locals can be any mapping,
    defaulting to the current globals and locals.
    If only globals is given, locals defaults to it.

02_2-抽象

# 对象(实例):由数据及能对其实施的操作所构成的封装体 类:类描述了 对象的特征(数据和操作)  
# 类具体化就是对象,对象抽象化就是类
# 类的定义:
# class classname(object):
#     'define classname class'
#     class_suite
# object是万类之源
class mydate(object):
    'this is a very simple example'
    pass
# 实例的创建——通过调用类对象
# 定义类——Dog
# 创建一个实例——dog
# 通过实例使用属性或方法——dog.greet()
class Dog(object):
    def greet(self):
        print ('Hi')
dog = Dog()
dog.greet()
Hi
# 实例属性
class Dog(object):
    'define Dog class'
    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()
Hi,I am called Paul.
# 对象的初始化方法__init__()
# 当类被调用后,python将创建实例对象
# 创建完实例对象以后,python自动调用的第一个方法为__init__()
# 实例对象作为方法的第一个参数(self)被传递进去,调用类创建实例对象是的参数都传给__init__()
# __init__()举例
class Dog(object):
    'define Dog class'
    def __init__(self,name):
        self.name = name
    def greet(self):
        print ('Hi,I am called %s.'%self.name)
if __name__=='__main__':
    dog = Dog('Sara')
    dog.greet()
Hi,I am called Sara.
# 类属性:类的数据属性(静态成员)仅仅是所定义的类的变量,在类创建后被使用;可以由类中的方法来更新,也可以在主程序中更新;类属性和实例无关,修改类属性需要使用类名  
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 called %s,my number is %d'%(self.name,Dog.counter))
if __name__=='__main__':
    dog = Dog('Sara')
    dog.greet()
Hi,I am called Sara,my number is 1

03-3_继承

# 父类(基类)子类(派生类)小汽车 is a 车,合适的继承关系是is a 的关系,不是has a的关系,如以日期为父类写历史金额往来,历史金额往来has a 日期   
# 子类的定义
class SubClassName(ParentClass1[,ParentClass2,...]):
    'optional class documentation string'
    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 called %s,my number is %d'%(self.name,Dog.counter))
        
class BarkingDog(Dog):
    'define subclass BarkingDog'
    def greet(self):
        'initial subclass'
        print ('Woof!I am called %s,my number is %d'%(self.name,Dog.counter))
        
if __name__=='__main__':
    dog = BarkingDog('Sara')
    dog.greet()
Woof!I am called Sara,my number is 1
# 私有属性和方法
# 默认情况下,python类的成员属性与方法都是“Public”
# 提供“访问控制符”来限定成员函数的访问:
# 双下划线(__)__var属性会被__classname_var替换,将防止父类与子类中的同名冲突
# 单下划线(_)在属性名前使用一个单下划线,防止模块的属性用“from mymodule import *”来加载
# 双下划线就是限定属性和方法在类内部可见
# 单下划线就是限定属性和方法在模块内部可见

02_5-2 图形用户界面

01_1-GUI的基本框架

# 创建一个简单的wxPython程序
# wxpython的安装 https://blog.csdn.net/cuicanlianyue/article/details/79167693
import wx  #引入wx的包
app= wx.App()  #创建一个应用程序对象
frame = wx.Frame(None,title = "Hello,World!") #创建一个框架,是其他UI组件的容器
frame.Show(True) #显示窗体
app.MainLoop() #进入事件循环,只能够读事件,找函数调用
0
# 组件
# 组件容器(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
import wx

class Frame1(wx.Frame):
    def __init__(self,superior):
        wx.Frame.__init__(self,parent = superior,title = "Example",pos = (100,200),size=(200,100))
        panel = wx.Panel(self)
        text1 = wx.TextCtrl(panel,value="Hello,world",size = (200,100))
if __name__ == '__main__':
    app = wx.App()
    frame = Frame1(None)
    frame.Show(True)
    app.MainLoop()
# 事件处理机制
# GUI程序工作的基本机制之一——事件处理
# 事件:移动鼠标,按下鼠标左键、单击按钮等;可以由用户操作触发产生,也可以在程序中创建对象产生
# wxpython程序将特定类型的事件关联到特定的一块代码(方法),当该类型的事件产生时,相关代码将响应事件被自动执行 
# 例:当产生鼠标移动事件时,OnMove()方法将被自动调用
import wx
class Frame1(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self, parent=parent, title='Example', pos=(100, 200), size=(200, 100))
        self.panel = wx.Panel(self)
        #鼠标左键抬起时触发时间绑定带OnClick函数
        self.panel.Bind(wx.EVT_LEFT_UP, self.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 = Frame1(None)
    frame.Show()
    app.MainLoop()

02_2-GUI常用组件

# 静态文本 列表框 输入框 按钮
# 按钮(Button及其家族)
# 功能:接受用户的点击事件,触发相应的操作;
# 常用按钮:—wx.Button:文本按钮—wx.BitmapButton:位图按钮—wx.ToggleButton:开关按钮 
# 绑定处理按钮点击的事件

# 菜单(Menu及其组件)
# 菜单:菜单栏、菜单、菜单项命令
# wyPython用于创建菜单的类: wx.MenuBar wx.Menu wx.MenuItem
# 菜单事件 wx.EVT_MENU

# 静态文本(StaticText)和文本框(TextCtrl)
# 文本框用于接收用户在框内输入的信息,或显示由程序提供的信息
# 静态文本框(标签):类:wx.StaticText 
# 文本框:类:wx.TextCtrl 常用形式:单行,多行,富文本框
            
            
# 列表用于显示多个条目并且可供用户选择
# 列表能够以下面四种不同模式建造:wx.LC_ICON(图标) wx.LC_SMALL_ICON(小图标) wx.LC_LIST(列表) wx.LC_REPORT(报告)  

# 单选与复选框
# 复选框用于从一组可选项中,同时选出多个选项 
# 单选框用于从一组互斥的选项中,选取其一

03_3-布局管理

# 绝对定位——每个窗口部件被创建时可以显示地指定它地位置和大小 缺点:定位不灵活 调整大小困难 受设备、操作系统甚至字体影响  
# 灵活布局的解决方案 -sizer 每个sizer有自己的定位策略 开发者只需要选择合适策略的sizer将窗口组件放入,并且指定好需求即可
# sizer本身不是一个容器或一个窗口部件,它只是一个屏幕布局的算法
# sizer允许嵌套 wxPython常用的sizer:wx.BoxSizer wx.FiexGridSizer wx.GridSizer wx.GridBagSizer wx.StaticBoxSizer     
# 使用sizer的步骤:1、创建自动调用尺寸的容器,例如panel 2、创建sizer 3、创建子窗口(窗体部件) 4、使用sizer的Add()方法将每个子窗口添加给sizer  5、调用容器的SetSizer(sizer)方法

import wx
class Frame1(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self, parent=parent, title='Example')
        self.panel = wx.Panel(self)
        sizer=wx.BoxSizer(wx.VERTICAL)
        #采用多行显示
        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 = Frame1(None)
    frame.Show()
    app.MainLoop()
#f.write(str) 将一个字符串写入文件
a =[[1,2,3],
    [4,5,6],
    [7,8,9]]
f = open(r'D:\software\test1.txt','w')
f.write(str(a))
f.close()
b =[[2,40,40],
    [5,50,60],
    [8,80,90]]
f = open(r'D:\software\test.txt','w')
f.write(str(b))
f.close()
pl.figure(figsize=(8,6),dpi=100)
t = np.arange(0,4,0.1)
pl.plot(t,t,color='red',linestyle='-',linewidth=3,label='line 1')
pl.plot(t,t+2,color='green',linestyle='',marker='*',linewidth=3,label='line 2')
pl.plot(t,t**2,color='blue',linestyle='',marker='+',linewidth=3,label='line 3')
pl.legend(loc='best')#'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'   
pl.show()
#f.read(size) 从文件中至多读出size字节数据,返回一个字符串
#f.read() 读文件直到文件结束,返回一个字符串
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt

p1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
p2 = np.array([[2,40,40],
    [5,50,60],
    [8,80,90]])

pl.figure(figsize=(8,6),dpi=100)
t = np.arange(0,4,0.1)
pl.plot(p1[:,2],p1[:,1],color='red',linestyle='-',linewidth=3,label='line 1')
pl.plot(p2[:,2],p2[:,1],color='green',linestyle='-',linewidth=3,label='line 2')
pl.legend(loc='best')#'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'   
for thresh, prec, rec in p1:
    plt.annotate(
    str(thresh),
    xy = (rec,prec),
    xytext = (8,8),
    textcoords = 'offset points'
    )
for thresh, prec, rec in p2:
    plt.annotate(
    str(thresh),
    xy = (rec,prec),
    xytext = (8,8),
    textcoords = 'offset points'
    )
plt.annotate
plt.xlabel("Recall",fontsize = 14)
plt.ylabel("Presion",fontsize = 14)
plt.savefig("pr.png")
pl.show()

在这里插入图片描述

04_4其他GUI库

# wxpython在tkinter的高效和pyqt的庞大之中取得了较好的平衡。
# wxpython的官网:http://wxpython.org
# PyQt 是python语言的GUI编程解决方案之一;提供了GPL与商业协议两种授权方式,可以免费地用于自由软件的开发;跨平台:可以运行于Microsoft Windows、Mac OS X、Linux以及其他类Unix平台上 
# PyQt的优缺点:
# 优点:文档比其他GUI库丰富;与Qt、C++开发经验互通;可使用大多数维Qt开发的组件;有方便的周边工具支持PyQt,如QtDesigner,Eric4
# 缺点:要注意避免内存泄露;运行时庞大;需要学习一些C++知识

# Tkinter:
# Tkinter绑定了Python的Tk GUI工具集,通过内嵌在Python解释器内部Tcl解释器实现
# Tkinter的调用转换成Tcl命令,然后交给Tcl解释器进行解释,实现Python的GUI界面
# Tkinter的优缺点:
# 优点:历史最悠久,是Python事实上的标准GUI;Python中使用Tk GUI工具集的标准接口,已包括在标准Python Windows安装中;著名的IDLE用Tkinter实现GUI;创建的GUI简单,学起来和用起来也简单
# 缺点:性能不太好,执行速度慢

# PyGTK:
# PyGTK是一套GTK+GUI库的Python封装
# PyGTK为创建桌面程序提供了一套综合的图形元素和其他使用的编程工具
# PyGTK是基于LGPL协议的免费软件
# 许多Gnome下的著名应用程序的GUI都是使用PyGTK实现的,比如BitTorrent,GIMP和Gedit都有可选的实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值