2021-04-27面向对象与GUI python

python学习

MOOCPython玩转数据

面向对象和图形用户界面

image.png

GUI与面向对象

# -*- coding: utf-8 -*-

#定义狗的父类
class Dog:
    "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("Paul")
    dog.greet()
#定义子类
class BarkingDog(Dog):
    "define subclass BarkingDog"
    def greet(self):
        "initial subclass"
        print("Woof!I am %s,my number is %d"%(self.name,Dog.counter))
if __name__=="__main__":
    dog=BarkingDog("Zoe")
    dog.greet()

抽象

定义一个表示班级的类,数据属性包括班主任姓名和学生姓名列表,具有以下方法:

(1)init()方法对数据进行初始化,以班主任的姓名初始化;

(2)add():加入一个学生姓名;

(3)remove():按照姓名移除学生;

(4)print_all():输出班主任姓名和所有学生名单。

先自己写一写这个程序然后填空(请把结果写在同一行上,中间用一个半角分号分隔)。
classcounter.py

class roster:
    "students and teacher class"
    teacher = ""
    students = [ ]
    def __init__(self, tn = 'Niuyun'):
        self.teacher = tn
    def add(self, sn):
        self.students.append(sn)
    def remove(self, sn):
        self.students.remove(sn)
    def print_all(self):
        print("Teacher:",self.teacher)
        print("Students:",self.students)

继承

image.png

BMI Calculating.py

# -*- coding: utf-8 -*-
"""
@author: zhuyue
"""
class BMI:
    def __init__(self,height,weight):
        self.bmi=weight/height**2
    def printBMI(self):
        print("Your BMI is {:.2f}".format(self.bmi))
if __name__ == "__main__":
    h = float(input('Please enter your height(m): '))
    w = float(input('Please input your weight(kg): '))
    x = BMI(h, w)
    x.printBMI()

class ChinaBMI(BMI):
    def printBMI(self):
        print("你的BMI是{:.2f}".format(self.bmi))
        if self.bmi<18.5:
            print("偏瘦, 相关疾病发病的危险性低(但其他疾病危险性增加)。")
        elif 18.5 <= self.bmi < 24:
            print("正常, 相关疾病发病的危险性为平均水平。")
        elif 24 <= self.bmi < 27:
            print("偏胖, 相关疾病发病的危险性为增加。")
        elif 27<=self.bmi<=30:
            print("肥胖, 相关疾病发病的危险性为中度增加。")
        else:
            print("重度肥胖, 相关疾病发病的危险性严重增加。")
if __name__ == "__main__":
    height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
    x=ChinaBMI(height,weight)
    x.printBMI()

GUI的基本框架

image.png

创建一个简单的wxPython程序
firstwxPython.py

import wx
app=wx.App()
frame=wx.Frame(None,title="Hello,World!")
frame.Show(True)
app.MainLoop()

改变一下


image.png

面板被放到窗口中,而静态文本对象被放到面板中。
mouse.py

# -*- coding: utf-8 -*-
import wx
class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None, title="Hello,World!")
        frame.Show(True)
        return True
if __name__ == "__main__":
    app=MyApp()
    app.MainLoop()

组建:


image.png

image.png

helloworld.py

# -*- coding: utf-8 -*-
import wx
class Frame1(wx.Frame):
    def __init__(self,superior):
        wx.Frame.__init__(self,parent=superior,title="Example",
        pos=(100,200),size=(350,200))
        panel=wx.Panel(self)
        text1=wx.TextCtrl(panel,value="Hello,World!",size=(350,200))

if __name__ == '__main__':
    app =wx.App()
    frame = Frame1(None)
    frame.Show(True)
    app.MainLoop()

事件处理机制:


image.png

mouse_event.py

# -*- coding: utf-8 -*-
#鼠标左键的抬起事件绑定在panel的Onclick上
import wx
class Frame1(wx.Frame):
    def __init__(self,superior):
        wx.Frame.__init__(self,parent=superior,title="Example",
        pos=(100,200),size=(350,200))
        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="Hello,World!",
                      pos=(posm.x,posm.y))

if __name__ == '__main__':
    app =wx.App()
    frame = Frame1(None)
    frame.Show(True)
    app.MainLoop()

GUI常用组件

image.png

按钮



菜单


image.png

静态文本和
image.png

列表


image.png

单选框、复选框
image.png

image.png

image.png

mouse_event2.py
实现在程序Frame中按下鼠标左键时,在鼠标按下的位置出现一个Button.

# -*- coding: utf-8 -*-
#鼠标左键的抬起事件绑定在panel的Onclick上
import wx
class Frame1(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title="title")
        self.panel=wx.Panel(self)
        self.panel.Bind(wx.EVT_LEFT_UP,self.OnClick)
        self.Show(True)
    def OnClick(self,event):
        posm=event.GetPosition()
        wx.Button(self.panel,label="Hi~~~",pos=(posm.x,posm.y))

if __name__ == '__main__':
    app =wx.App()
    frame = Frame1(None,"Hello Python!")
    app.MainLoop()

布局管理

image.png

image.png

image.png

image.png

helloworldbtn.py

# -*- coding: utf-8 -*-
import wx
class Frame1(wx.Frame):
    def __init__(self,superior):
        wx.Frame.__init__(self, parent = superior, title = "Hello World in wxPython")
        #创建自动调用尺寸的panel容器
        panel = wx.Panel(self)
        #创建一个BoxSizer实例,方向是垂直方向
        sizer = wx.BoxSizer(wx.VERTICAL)
        #创建子窗口部件
        self.text1= wx.TextCtrl(panel, value = "Hello, World!", size = (200,180), style = wx.TE_MULTILINE)
        #使用sizer的Add()方法将每个子窗口添加给sizer
        sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND)
        #添加按钮子窗口部件
        button = wx.Button(panel, label = "Click Me")
        sizer.Add(button)
        #调用容器的SetSizer(sizer)方法
        panel.SetSizerAndFit(sizer)
        panel.Layout()
        #鼠标左键的抬起事件绑定在panel的Onclick上
        self.Bind(wx.EVT_BUTTON,self.OnClick,button)
        self.Show(True)
    def OnClick(self, text):
        self.text1.AppendText("\nHello, World!")
if __name__ == '__main__':
    app=wx.App()
    frame=Frame1(None)
    app.MainLoop()

其他GUI库

PyQt

image.png
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets
class TestWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hello World!")
        self.outputArea=QtWidgets.QTextBrowser()
        self.helloButton=QtWidgets.QPushButton("Click Me")
        self.layout=QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.outputArea)
        self.layout.addWidget(self.helloButton)
        self.setLayout(self.layout)
        self.helloButton.clicked.connect(self.sayHello)
    def sayHello(self):
        self.outputArea.append("Hello, World!")
if __name__ == '__main__':
    app=QtWidgets.QApplication(sys.argv)
    testWidget=TestWidget()
    testWidget.show()
    sys.exit(app.exec_())

Tkinter

# -*- coding: utf-8 -*-
import tkinter as tk
class Tkdemo(object):
    def __init__(self):
        self.root = tk.Tk()
        self.txt = tk.Text(self.root, width=30, height=10)
        self.txt.pack()
        self.button = tk.Button(self.root, text = 'Click me',
        command = self.sayhello)
        self.button.pack()
    def sayhello(self):
        self.txt.insert(tk.INSERT, "Hello, World!\n")
d = Tkdemo()
d.root.mainloop()

PyGTK

image.png

单元测试

# -*- coding: utf-8 -*-
class Animal(object):
    def __init__(self, name):
        self.name = name

    def getInfo(self):
        print("This animal's name:", self.name)

    def sound(self):
        print("The sound of this animal goes?")

class Dog(Animal):
    def __init__(self, name, size):
        self.name = name
        self.__size = size

    def getInfo(self):
       print("This dog's name:", self.name)
       print("This dog’s size:", self.__size)
if __name__=="__main__":
    dog = Dog('wangcai', 'small')
    dog.getInfo()
    dog.sound()

class Cat(Animal):
    def sound(self):
        print("The sound of cat goes meow ~")
if __name__=="__main__":
    cat = Cat('kawaii')
    cat.getInfo()
    cat.sound()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容