Python学习(五)

EasyGui 图形用户界面

EasyGui官方教程
http://easygui.sourceforge.net/tutorial.html

简介

在EasyGui中,所有GUI交互都通过简单的函数调用来执行。

导入EasyGui

安装完成EasyGui后,导入它

import easygui
# 注意安装后需要重启IDLE,否则会报错

但是使用这种形式导入,当你使用EasyGui函数的时候,必须在函数的前面加上前缀easygui
在这里插入图片描述
为了EasyGui的使用不那么麻烦,就选择导入整个EasyGui包

from easygui import *

在这里插入图片描述
还可以自定义模块的的名字来导入模块

import easygui as g

这样可以既保持EasyGui的命名空间,同时减少代码量
在这里插入图片描述

一个简单的例子

# msgbox语法
msgbox(msg='(Your message goes here)', title=' ', ok_button='OK', image=None, root=None)
# 趣味小实例
import easygui as g
import sysdef start():g.msgbox(msg = "This is a game!", title = 'This is a game!', ok_button = '开始游戏')if g.ccbox(msg = "不可以点第一个按钮", title = 'This is a game!', choices = ("试一下也没关系!", "我很乖,不点它!")):chengfa()else:jiangli()def chengfa():# 这里已经提前存好了图片choice = g.buttonbox(msg = "我不是说了不可以点吗!看来要给你点惩罚了,从下面选择一个惩罚!", title = "This is s game!", choices = ("成为舞法天女", "成为绿帽侠","成为菜虚鲲") )if str(choice)== "成为绿帽侠":g.msgbox(msg = "恭喜你成为绿帽侠!", title = 'This is a game!', image = ".\\pic\\lvmao.png")elif str(choice)=="成为舞法天女":g.msgbox(msg = "恭喜你成为舞法天女!", title = 'This is a game!', image = ".\\pic\\tiannv.png")else:g.msgbox(msg = "恭喜你成为菜虚鲲!", title = 'This is a game!', image = ".\\pic\\cxk.png")        def jiangli():g.msgbox(msg = "你咋这么听话呢!看来要奖励一下你了!", title = 'This is a game!')g.msgbox(msg = "让我们开启哲♂学大门!", title = 'This is a game!', image = ".\\pic\\zhexue.png")start()

注意:建议不要在IDLE上运行EasyGui,EasyGui是运行在Tkinter 上并拥有自身的事件循环,而IDLE 也是Tkinter 写的一个应用程序并也拥有知道自身的事件循环。因此当两者同时运行的时候,也可能会发生冲突,且带来不可预测的结果。因此如果你发现你的EasyGui 程序有这样的问题,请尝试在IDLE 外无运行你的程序。

# 官方实例
from easygui import *
while 1:msgbox("Hello, world!")msg ="What is your favorite flavor?"title = "Ice Cream Survey"choices = ["Vanilla", "Chocolate", "Strawberry", "Rocky Road"]choice = choicebox(msg, title, choices)# note that we convert choice to string, in case# the user cancelled the choice, and we got None.msgbox("You chose: " + str(choice), "Survey Result")msg = "Do you want to continue?"title = "Please Confirm"if ccbox(msg, title):     # show a Continue/Cancel dialogpass  # user chose Continueelse:sys.exit(0)           # user chose Cancel


对象

对象 = 属性 + 方法
在这里插入图片描述
在Python中为了方便区分,类名是以大写字母开头的,函数名以小写字母开头。

  • 创建一个对象
    在这里插入图片描述

面向对象OO

OO = Object Oriented

  • 面向对象编程的特征
    (1)封装:表面上看对象封装了属性和方法,封装更是一种信息隐蔽技术,使信息更加安全。
    例如列表中的排序方法sort()和添加对象方法append(),你并不知道到Python内部是如何操作的,只是利用方法名字的调用来达到目的,这就是封装。
    在这里插入图片描述
    (2)继承:继承是子类自动共享父类之间数据和方法的机制。
    在这里插入图片描述
    定义的这个MyList的类,继承了属于list的方法和属性,所以可以在MyList类创建出list2的实例中使用。
    (3)多态:不同对象对同一方法响应不同的行动。
    在这里插入图片描述

面向对象编程

OOA:面向对象分析
OOP:面向对象编程
OOD:面向对象设计

  • self
    Python的self相当于C++的this指针;
    self参数是类本身的实例变量,调用时不用传递该参数,只需要在类定义的时候把self写入第一个参数。
    在这里插入图片描述
    在这里插入图片描述
    在这里a.kick()有第一个参数,是隐藏的,把a这个对象的标志传进去,self.name就接收到了,就会去找到a对象的name属性,并把它赋值打印出来。

  • __init__(self)
    是一个构造方法,只要实例化一个对象的时候,那么这个方法就会在对象被创建的时候自动调用,就像是在c++中的构造函数。
    在这里插入图片描述
    在这里插入图片描述
    这时再直接建立一个对象,就会报错,因为这个对象需要一个name参数。

  • 公有和私有
    默认上讲,对象的属性和方法都是公有的,可以通过点操作符进行访问
    在这里插入图片描述
    为了实现类似于私有变量的特征,Python内部采用了name mangling 技术(名字改编、名字重整),在Python中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会变为私有的了。
    在这里插入图片描述
    这里在外部将变量名给隐藏起来了,理论上来说,如果需要访问,就需要从内部进行操作
    在这里插入图片描述
    从内部引用属性,得到私有变量,其实Python只是将双下划线开头的变量进行了名字改编,改成了“_类名__变量名”
    在这里插入图片描述
    其实Python的私有机制就是伪私有,Python的类没有权限模式的,可以被外部调用的。


继承

# 语法
class DerivedClassName(BaseClassName):......
# DerivedClassName 是子类
# BaseClassName 是父类、基类或超类

在这里插入图片描述
Child继承了Parent(父类)的方法,可以直接调用方法。
如果子类中定义了与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
在这里插入图片描述

import random as rclass Fish:def __init__(self):self.x = r.randint(0, 10)self.y = r.randint(0, 10)def move(self):self.x -= 1print("我的位置是:", self.x, self.y)class Goldfish(Fish):passclass Crap(Fish):passclass Salmon(Fish):passclass Shark(Fish):def __init__(self):self.hungry = Truedef eat(self):if self.hungry:print("进食ing!")self.hungry = Falseelse:print("已经吃饱了!")

在这里插入图片描述
shark不能调用move方法是由于在子类Shark中重写了父类的__init__方法,把父类中__init__方法中的x定义覆盖了,所以应该在子类的__init__方法中加入变量,由以下两种技术进行实现:调用未绑定的父类方法和使用super函数

调用未绑定的父类方法

只需要改变一行

import random as rclass Fish:def __init__(self):self.x = r.randint(0, 10)self.y = r.randint(0, 10)def move(self):self.x -= 1print("我的位置是:", self.x, self.y)class Goldfish(Fish):passclass Crap(Fish):passclass Salmon(Fish):passclass Shark(Fish):def __init__(self):Fish.__init__(self)	#加这一行# 这一行是指调用父类的方法,但是在这里self并非父类的实例对象,而是子类shark的实例对象self.hungry = Truedef eat(self):if self.hungry:print("进食ing!")self.hungry = Falseelse:print("已经吃饱了!")

在这里插入图片描述
相当于传入子类对象给Fish.__init__()
在这里插入图片描述

使用super函数

super函数可以自动找到基类的方法,还会传入self参数
在这里插入图片描述
在这里插入图片描述

多重继承

# 语法
class DerivedClassName(Base1, Base2, Base3):......

在这里插入图片描述
多重继承很容易导致代码混乱,出现不可预见的BUG,当非必须使用时尽量避免使用多重继承。


组合

组合就是把类的实例化放到新类中,把旧类给组合进去,不需要继承,相对没有风险。

class Turtle:def __init__(self, x):self.num = xclass Fish:def __init__(self, x):self.num = xclass Pool:def __init__(self, x, y):self.turtle = Turtle(x)self.fish = Fish(y)def print_num(self):print("水池里总共有乌龟 %d 只,小鱼 %d 条!" % (self.turtle.num, self.fish.num))

在这里插入图片描述
组合就是把几个没有继承关系的、没有纵向关系的,基于横向关系的类放到一起。
【拓展,Python支持的一种独特形式的编程:Mix-in】


类、类对象和实例对象

在这里插入图片描述
在这里插入图片描述
若属性的名字和方法相同,属性会把方法覆盖掉。
在这里插入图片描述
所以不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展;用不同的词性命名,如属性名用名词,方法名用动词。

绑定

Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。
在这里插入图片描述
在这里插入图片描述
所以在大多数情况下,编程中考虑使用实例属性“self.x,self.y”,而不要使用类属性,类属性通常是仅用来跟踪与类相关的一些值。


与类相关的内置函数

  • issubclass(class, classinfo)
    如果第一个参数class是第二个参数classinfo的子类就返回True。
    (1)这是一个非严格性的检查,所以一个类会被认为是其自身的子类。
    (2)classinfo可以是类对象组成的元组,只要class与其中的任何一个人候选类的子类,则返回True。
    在这里插入图片描述

  • isinstance(object, classinfo)
    检查一个实例对象是否属于一个类的,同样的也可以传入一个元组。
    (1)如果第一个参数不是对象,则会永远返回False。
    (2)如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError异常。
    在这里插入图片描述

  • hasattr(object, name)
    attr(attribute:属性)
    测试一个对象里面是否有指定的属性,object是对象,name是属性名。
    在这里插入图片描述
    由于name处传入的值是属性名,所以必须是字符串类型的数据,直接传入“x”会误认为成是个变量。

  • getattr(object, name[, default])
    返回对象指定的属性值,如果指定的属性不存在,且设置了default,会将default打印出来,否则抛出AttributeError。
    在这里插入图片描述

  • setattr(object, name, value)
    可以设置对象中指定属性的值,若指定的属性不存在,会新建一个新的属性,并给它赋值。
    在这里插入图片描述

  • delattr(object, name)
    删除对象中指定的属性,如果属性不存在则抛出AttributeError的异常。
    在这里插入图片描述

  • property(fget=None, fset=None, fdel=None, doc=None)
    设置一个属性来去设置定义好的属性。
    在这里插入图片描述
    使用属性x来操作这些属性,必须传入写好的方法,fget是获取属性的方法,fset是设置属性的方法,fdel是删除属性的方法。
    property 在使用上方便了类内方法的修改,使修改后不用再更改接口。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部