# -*- coding: utf-8 -*-
#画多啦A梦叮当猫,按dlam.html改编。
# 分析:
# 叮当猫由头、脸、眼、眼珠、鼻子、嘴、胡子、项带、铃当、身子、围嘴、手臂、手、脚组成。
# 其中:头、脸、眼、眼珠、鼻子、嘴、胡子组成一个部件;其余元件组成一个部件。
import math
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Shape: # 图形基类(叮当猫各部件(形状)共有的属性)
def __init__(self, qp, QRect, QColor=QColor("#07bbee")): # 构造方法参数:形状,位置坐标,颜色, color="#07bbee"
self.qp = qp #qpainter()的实例
self.rect = QRect # 坐标(x1, y1, x2, y2)
self.color = QColor #颜色
self.qp.setPen(QPen(Qt.black, 3)) #边线
class Liner: #直线类
def __init__(self, qp, QRect):
self.qp = qp
self.rect = QRect
self.width = 1
class Arc: #弧线类
def __init__(self, qp, QRect, startAngle, spanAngle):
self.qp = qp
self.rect = QRect
self.startAngle = startAngle
self.spanAngle = spanAngle
class eyeball(Shape): #眼珠
def draw(self):
self.qp.setBrush(self.color) #设置画刷
self.qp.drawEllipse(self.rect) #画圆形x,y,w,h 120, 25, 160, 160
class mouth(Arc):
def draw(self):
self.qp.drawArc(self.rect,self.startAngle,self.spanAngle) #后面两个参数分别为 起始角与跨度角
class beard(Liner): #中央竖线
def draw(self):
self.qp.drawLine(self.rect)
class Beards: #胡须组合
def __init__(self, qp, start_point): # w,h 宽、高
self.qp = qp #
self.start_point = start_point #起始坐标
self.bd0 = beard(self.qp, self.bd0_cacu())
self.bd1 = beard(self.qp, self.bd1_cacu())
self.bd2 = beard(self.qp, self.bd2_cacu())
self.bd00 = beard(self.qp, self.bd00_cacu())
self.bd11 = beard(self.qp, self.bd11_cacu())
self.bd22 = beard(self.qp, self.bd22_cacu())
def draw(self): # 绘制
self.bd1.draw()
self.bd0.draw()
self.bd2.draw()
self.bd11.draw()
self.bd00.draw()
self.bd22.draw()
def bd0_cacu(self): # 计算胡须的坐标
x1 = self.start_point[0] - 40
y1 = self.start_point[1] - 5
x2 = x1 - 58
y2 = y1 - 20
return QLineF(x1, y1, x2, y2)
def bd1_cacu(self): # 计算中间胡须的坐标
x1 = self.start_point[0] - 40
y1 = self.start_point[1] + 5
x2 = x1 -65
y2 = y1
return QLineF(x1, y1, x2, y2)
def bd2_cacu(self): # 计算胡须的坐标
x1 = self.start_point[0] - 40
y1 = self.start_point[1] + 15
x2 = x1 -58
y2 = y1 + 20
return QLineF(x1, y1, x2, y2)
def bd00_cacu(self): # 计算胡须的坐标
x1 = self.start_point[0] + 40
y1 = self.start_point[1] - 5
x2 = x1 + 58
y2 = y1 - 20
return QLineF(x1, y1, x2, y2)
def bd11_cacu(self): # 计算胡须的坐标
x1 = self.start_point[0] + 40
y1 = self.start_point[1] + 5
x2 = x1 + 65
y2 = y1
return QLineF(x1, y1, x2, y2)
def bd22_cacu(self): # 计算胡须的坐标
x1 = self.start_point[0] + 40
y1 = self.start_point[1] + 15
x2 = x1 + 58
y2 = y1 + 20
return QLineF(x1, y1, x2, y2)
class head(Shape): # 头
def draw(self):
##实例:x1,y1,x2,y2,即渐变的起始点和终止点
linearGradient = QLinearGradient(420, 0, 100, 280)
#线性渐变色的效果,以整个图形区间为100%,
#分成多段设置颜色,各颜色按百分比分配。
linearGradient.setColorAt(0.1, Qt.white) #10%处白色
linearGradient.setColorAt(0.2, self.color) #60%处绿色 #07bbee
linearGradient.setColorAt(0.8, self.color) #60%处绿色 #07bbee
linearGradient.setColorAt(1.0, Qt.black) #100%处黑色
self.qp.setBrush(linearGradient) #设置画刷
# self.qp.setBrush(self.color)
# qp.drawRoundedRect(120, 25, 160, 160, 40, 40, Qt.RelativeSize) #画圆角矩形x1,y1,x2,y2,圆角的角度
self.qp.drawEllipse(self.rect) #画圆形x,y,w,h 120, 25, 160, 160
class nose(Shape): #鼻子
def draw(self):
RadialGradient = QRadialGradient(265, 144, 6, 265, 144) #辐射渐变
#参数分别为中心坐标,半径长度和焦点坐标,
#如果需要对称那么中心坐标和焦点坐标要一致 #c93300
#辐射渐变色的效果,以整个图形区间为100%,
#分成多段设置颜色,各颜色按百分比分配。
RadialGradient.setColorAt(0.0, Qt.white) #10%处白色
RadialGradient.setColorAt(1.0, self.color) #60%处绿色 #07bbee
# RadialGradient.setColorAt(1.0, Qt.black) #100%处黑色
self.qp.setPen(QPen(Qt.black, 2)) #边线
self.qp.setBrush(RadialGradient) #设置画刷
self.qp.drawRoundedRect(self.rect, 80, 80, Qt.RelativeSize) #画圆角矩形x,y,w,h,圆角的角度
class face(Shape):
def draw(self):
self.qp.setPen(Qt.NoPen) #无边线
self.qp.setBrush(self.color) #设置画刷
self.qp.drawEllipse(self.rect) #画圆形x,y,w,h 120, 25, 160, 160
class eye(Shape): #眼框
def draw(self):
self.qp.setBrush(self.color) #设置画刷
self.qp.drawRoundedRect(self.rect, 90, 90, Qt.RelativeSize) #画圆角矩形x1,y1,x2,y2,圆角的角度
class Heads: # 头部整体(组合头、脸、眼、鼻、嘴、胡子)
def __init__(self, qp, start_point,w, h): # w,h是帽子的宽、高
self.qp = qp #
self.start_point = start_point #起始坐标
self.w = w
self.h = h
self.hd = head(self.qp, self.hd_cacu(), QColor('#07bbee')) # 例化头
self.fc = face(self.qp, self.fc_cacu(), Qt.white) #脸
self.nos = nose(self.qp, self.nos_cacu(), QColor("#c93300")) #鼻子
self.eye0 = eye(self.qp, self.ey0_cacu(), Qt.white) # 实例化眼0
self.eye1 = eye(self.qp, self.ey1_cacu(), Qt.white) #眼1
self.bds = Beards(self.qp, (260, 185)) #胡须组合的起始位置
self.bd = beard(self.qp, self.bd_cacu()) #中央竖线
self.mt = mouth(self.qp, self.mt_cacu(), 230 * 16, 80 * 16) #弧线的起始角度, 弧线角度(角度*16)
self.mt2 = mouth(self.qp, self.mt2_cacu(), 230 * 16, 80 * 16) #弧线的起始角度, 弧线角度(角度*16)
self.eb0 = eyeball(self.qp, self.eb0_cacu(), Qt.black) #眼珠0
self.eb1 = eyeball(self.qp, self.eb1_cacu(), Qt.black) #眼珠1
def draw(self): # 绘制
self.hd.draw() #调用头方法绘制
self.fc.draw() # 调用脸方法绘制
self.nos.draw() # 调用底部方法绘制
self.eye0.draw()
self.eye1.draw()
self.bds.draw()
self.bd.draw() #调用头方法绘制
self.mt.draw()
self.mt2.draw()
self.eb0.draw() #眼珠
self.eb1.draw()
def eb0_cacu(self): # 计算眼珠的坐标
x = self.start_point[0] + self.w / 2 - 25
y = self.start_point[1] + 70
w = 12
h = 12
return QRect(x, y, w, h)
def eb1_ca
Python3画图实例2例
需积分: 45 22 浏览量
2018-05-04
00:09:30
上传
评论 2
收藏 7KB ZIP 举报
jijun
- 粉丝: 4
- 资源: 3
最新资源
- C#,煎饼排序问题(Pancake Sorting Problem)算法与源代码
- C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码
- C#,老鼠迷宫问题的回溯法求解(Rat in a Maze)算法与源代码
- 6693eeb8d683458a07938615fba9e68f.apk
- C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码
- C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码
- C#,子集和问题(Subset Sum Problem)的算法与源代码
- mongodb 数据库基本操作
- Linux操作系统基础教程
- Linux操作系统相关习题集
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈