一步步教你怎么用Python画雪人,进一步熟悉Python的基础画图操作,废话不多说,上代码。

希望您给个关注给个赞,也算对我们的支持了。

class Shape:     # 基类(雪人各部件(形状)共有的属性)def __init__(self, cvns, points, fill):     # 构造方法  画布  位置坐标  颜色self.cvns = cvns                 # 画布self.points = points             # 坐标(x1, y1, x2, y2)self.fill = fillself.pid = None                  # 当前图形的iddef delete(self):         # 删除图形if self.pid:self.cvns.delete(self.pid)class ShapeAngles(Shape):     # 继承基类(增加了角度))def __init__(self, cvns, points, fill, angles=(10, 170)):        # angles:角度值,带默认参数super(ShapeAngles, self).__init__(cvns, points, fill)   # 调用基类构造: cvns,points,fillself.angles = {'start':angles[0], 'extent':angles[1]}  # 构造自己的属性:anglesclass HatTop(Shape):      # 帽子顶部def draw(self):
#        self.pid = self.cvns.create_oval(self.points, fill='white')       # 椭圆形self.pid = self.cvns.create_oval(self.points, fill=self.fill)       # 椭圆形class HatBottom(Shape):    # 帽子底部def draw(self):self.pid = self.cvns.create_polygon(self.points)     # 绘多边形的方法class Hat:         # 帽子整体(组合顶部和底部)def __init__(self, cvns, start_point, fill, w, h):    # w,h是帽子的宽、高self.cvns = cvns                            # 初始化self.start_point = start_pointself.w = wself.fill = fillself.h = hself.ht = HatTop(self.cvns, self.ht_cacu(), fill=self.fill)        # 实例化顶部self.hb = HatBottom(self.cvns, self.hb_cacu(), self.fill)         # 实例化底部def draw(self):                # 绘制self.ht.draw()              # 调用顶部方法绘制self.hb.draw()              # 调用底部方法绘制def delete(self):self.ht.delete()# self.hb.delete()def ht_cacu(self):             # 计算顶部坐标r = self.h / 3 / 2x1 = self.start_point[0] + self.w / 2 - ry1 = self.start_point[1] + 20 - rx2 = x1 + 2 * ry2 = y1 + 2 * rreturn x1, y1, x2, y2def hb_cacu(self):              # 计算底部坐标(三角形的三个点的坐标)x1 = self.start_point[0] + self.w / 2y1 = self.start_point[1] + self.h / 3x2 = self.start_point[0] + self.w / 3y2 = self.start_point[1] + self.h + 13x3 = self.start_point[0] + self.w / 3 * 2y3 = y2return x1, y1, x2, y2, x3, y3class Sense(ShapeAngles):                # 五官(眼、口扇形图形)def draw(self):self.pid = self.cvns.create_arc(*self.points, **self.angles, fill='red')    # 绘制弧线class Face(HatTop):   # 脸passclass Head:         # 头部def __init__(self, cvns, start_point, fill, w, h):    # 此处的w,h是头的self.cvns = cvnsself.start_point = start_pointself.fill = fillself.w = wself.h = heye0_points = self.eye0_cacu()     # 眼睛1坐标dx = self.h / 3 + self.h / 9eye1_points = (eye0_points[0] + dx, eye0_points[1],    # 眼睛2坐标eye0_points[2] + dx, eye0_points[3])self.face = Face(self.cvns, self.face_cacu(), self.fill)          # 脸:带参数的实例self.eye0 = Sense(self.cvns, eye0_points, fill='blue')              # 眼1:带参数的实例self.eye1 = Sense(self.cvns, eye1_points, self.fill)              # 眼2:带参数的实例self.mouth = Sense(self.cvns, self.mouth_cacu(), (-10, -170))  # 口:带参数的实例def draw(self):# 绘制脸部各部位self.face.draw()self.eye0.draw()self.eye1.draw()self.mouth.draw()def face_cacu(self):             # 脸坐标计算x1 = self.start_point[0] + (self.w - self.h) / 2y1 = self.start_point[1]x2 = x1 + self.hy2 = y1 + self.hreturn x1, y1, x2, y2def eye0_cacu(self):              # 眼0坐标计算left_point = (self.start_point[0] + (self.w - self.h) / 2 - 5, self.start_point[1])x1 = left_point[0] + self.h / 6y1 = left_point[1] + self.h / 3x2 = x1 + self.h / 3y2 = left_point[1] + self.h / 2return x1, y1, x2, y2def mouth_cacu(self):            # 口坐标计算left_point = (self.start_point[0] + (self.w - self.h) / 2, self.start_point[1])x1 = left_point[0] + self.h / 3y1 = left_point[1] + 2 * self.h / 3 + 25      # +25后口的位置靠下,并且图形更大了x2 = x1 + self.h / 3y2 = left_point[1] + self.h / 2return x1, y1, x2, y2class hand(HatTop):            # 手passclass BodyOutline(HatTop):      # 身体轮廓,因没有特别的形状,继承了基类,类体为空passclass Button(HatTop):            # 钮扣passclass Body:                      # 身体def __init__(self, cvns, start_point, fill, w, h):self.cvns = cvnsself.start_point = start_pointself.w = wself.h = hself.fill = fillself._button_size = 10        # 钮扣的大小self.buttons = []self.bo = BodyOutline(self.cvns, self.body_cacu(), self.fill)      # 身体轮廓实例
#        self.hd = hand(self.cvns, (15, 500, 45, 240), self.fill)           # 左手轮廓实例,坐标为矩形的两个对角顶点的坐标为准画的圆/椭圆self.hd = hand(self.cvns, self.bd_cacu(0), self.fill)           # 左手轮廓实例,坐标为矩形的两个对角顶点的坐标为准画的圆/椭圆self.hd2 = hand(self.cvns, self.bd_cacu(self.w), self.fill)  # 右手for pnts in self.all_button_points():self.buttons.append(Button(self.cvns, pnts, self.fill))def bd_cacu(self, w):  # 计算手的坐标x1 = 15 + wy1 = self.start_point[1] + self.h / 2x2 = x1 + 30y2 = y1 - 26 * self._button_sizereturn x1, y1, x2, y2def draw(self):self.bo.draw()                # 身体绘制self.hd.draw()                # 手1绘制self.hd2.draw()               # 手2绘制for bttn in self.buttons:    # 各钮扣绘制bttn.draw()def body_cacu(self):           # 计算身体轮廓坐标x1, y1 = self.start_pointx2 = x1 + self.wy2 = y1 + self.hreturn x1, y1, x2, y2def button0_cacu(self):        # 计算第0个钮扣的坐标x1 = self.start_point[0] + self.w / 2 - self._button_sizey1 = self.start_point[1] + self.h / 5 - self._button_sizex2 = x1 + 2 * self._button_size         # 2决定钮扣的园形形状y2 = y1 + 2 * self._button_sizereturn x1, y1, x2, y2def move_dy(self, points, size):   # 钮扣移动的方法y1 = points[1] + sizey2 = points[3] + sizereturn points[0], y1, points[2], y2def all_button_points(self):          # 绘制每个钮扣的坐标b0_points = self.button0_cacu()size = self.h / 6                   # 身高/钮扣数+1points = []                         # 列表for i in range(5):                 # 钮扣的个数points.append(self.move_dy(b0_points, i * size))   # 各钮扣的移动数据存入列表pointsreturn points                   # 返回列表值# def set_button_size(self, size):#     self._button_size = sizeclass Snow:           # 组装成雪人def __init__(self, cvns, points, fill, w=150, h=450):       # points为雪人的坐标其与帽子坐标一致(见雪人图)self.cvns = cvnsself.points = pointsself.w = wself.h = hself.fill = fillself.head = Head(self.cvns, (self.points[0], self.points[1] + self.h / 6), self.fill, self.w, self.h / 3)   # 实例化头部self.body = Body(self.cvns, (self.points[0], self.points[1] + self.h / 2), self.fill, self.w, self.h / 2)   # 实例化身体self.fill = 'red'                                                            # 帽子顶部颜色self.hat = Hat(self.cvns, self.points, self.fill, self.w, self.h / 6)        # 绘帽子                             # 实例化帽子def draw(self):self.hat.draw()         # 绘制帽子self.head.draw()        # 绘制头self.body.draw()        # 绘制身体if __name__ == '__main__':import tkinterroot = tkinter.Tk()         # 建立根窗口cvns = tkinter.Canvas(root, width=400, height=700, bg='white')   # 调用画布cvns.pack()                 # 将画布添加到窗口snow = Snow(cvns, (30, 15), 'white', 320, 660)   # 雪人的实例化(传入画布对象、起始坐标、宽、高)snow = snow.draw()          # 绘制root.mainloop()

Python画图基础操作之全注释画雪人相关推荐

  1. 一次性掌握所有 Python 画图基础操作

    pythonpythonpython 画图介绍 嘿!彩蛋!感觉有帮助就三连呗! 本文以实用为第一目标,保证读者在看完此文之后可以迅速上手 pythonpythonpython 画图,掌握所有画图的基本 ...

  2. python必备基础代码-新手上路必学的Python函数基础知识,全在这里了(多段代码举例)...

    原标题:新手上路必学的Python函数基础知识,全在这里了(多段代码举例) 导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写 ...

  3. python全栈第21期_2019 Python最新基础入门(全栈21期)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2019 Python最新基础入门(全栈21期) 01s21开班仪式 开班入学必听Alex大神讲行业前景1 .mp4 开班入学必听Alex大神讲行业前景2 ...

  4. Python语音基础操作--4.3共振峰估计

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  5. Python语音基础操作--11.2基于GMM的说话人识别模型

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  6. Python语音基础操作--6.3ADPCM编码

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  7. Python语音基础操作--2.3声强与响度

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  8. Python语音基础操作--10.2隐马尔科夫模型的孤立字识别

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  9. Python语音基础操作--5.1自适应滤波

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

最新文章

  1. andriod studio中的显式跳转和隐式跳转
  2. redmine3.3.1安装与常用插件安装
  3. JVM — 类加载机制
  4. 多看 android6,多看阅读本地版
  5. JS动态添加、删除classl类
  6. 前端之 BOM 和 DOM
  7. Python-import导入上级 本级 目录文件
  8. “大龄”程序员的出路
  9. 第一个DFS,第一个递归 HDU1515
  10. JAX-WS编写webservice
  11. Unity渲染管线详解
  12. 十折交叉验证python_Python机器学习:6.2 K折交叉验证评估模型性能
  13. 太阳直射点纬度计算公式_利用旗杆影子——判断日出日落、季节、昼长、经纬度、太阳高度角...
  14. 图片,PDF转换成文字
  15. Mrbayes使用形态学数据构建系统发育树
  16. 【数据结构】约瑟夫问题
  17. 新型病毒DoubleAgent 先入侵杀毒软件
  18. python抓取京东联盟优惠券_[爬虫]使用python抓取京东全站数据(商品,店铺,分类,评论)...
  19. VS2015程序工程的ICO图标研究
  20. MobileNet实战:tensorflow2.X版本,MobileNetV3图像分类任务(小数据集)

热门文章

  1. linux信息收集命令,linux中收集系统信息的一些命令
  2. android手机存储优化,Android手机系统优化方法
  3. Bean Searcher配合SpringBoot的使用感受
  4. 程序就是计算机软件,计算机软件就是计算机程序对吗?
  5. oracle max decode竖表改横表
  6. Day One,配置ssh免密码登陆
  7. 21.国民技术N32G45X例程之-U盘模式IAP升级固件
  8. 数据分析方法论3:综合指标分析法
  9. 基于uni-app+uni ui考勤打卡H5项目 定位打卡,日历打卡记录,考勤记录,绩效(地图位置)等
  10. 查询是谁在用挂载的硬盘