千家信息网

Python如何绘制多啦A梦叮当猫

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章将为大家详细讲解有关Python如何绘制多啦A梦叮当猫,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。分析:叮当猫由头、脸、眼、眼珠、鼻子、嘴、胡子、项带、铃
千家信息网最后更新 2025年01月22日Python如何绘制多啦A梦叮当猫

这篇文章将为大家详细讲解有关Python如何绘制多啦A梦叮当猫,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

分析:叮当猫由头、脸、眼、眼珠、鼻子、嘴、胡子、项带、铃当、身子、围嘴、手臂、手、脚组成。 其中:头、脸、眼、眼珠、鼻子、嘴、胡子组成一个部件;其余元件组成一个部件。废话不多说,上代码。

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

import mathimport sysfrom 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_cacu(self):             # 计算眼珠的坐标        x = self.start_point[0] + self.w / 2 + 15        y = self.start_point[1] + 70        w = 12          h = 12           return QRect(x, y, w, h)     def bd_cacu(self):             # 计算中央竖线的坐标        x1 = self.start_point[0] + self.w / 2        y1 = self.start_point[1] + 135        x2 = x1        y2 = y1 + 95        return QLineF(x1, y1, x2, y2)     def mt_cacu(self):             # 计算嘴的坐标        x = self.start_point[0] + 50        y = self.start_point[1] + 45        w = 220          h = 186          return QRect(x, y, w, h)     def mt2_cacu(self):             # 计算嘴的坐标        x = self.start_point[0] + 60        y = self.start_point[1] + 49        w = 200          h = 185          return QRect(x, y, w, h)     def nos_cacu(self):             # 计算鼻子的坐标        # r = self.h / 3 / 2        x = self.start_point[0] + self.w /2 -15        y = self.start_point[1] + 105        w = 30          h = 30          return QRect(x, y, w, h)     def hd_cacu(self):             # 计算头的坐标        x = self.start_point[0]        y = self.start_point[1]        w = self.w          h = self.h          return QRect(x, y, w, h)     def fc_cacu(self):             # 计算脸的坐标        x = self.start_point[0] + 35        y = self.start_point[1] + 65        w = self.w - 65         h = self.h - 100         return QRect(x, y, w, h)     def ey1_cacu(self):              # 计算眼1的坐标(圆角矩形)        x = self.start_point[0] + self.w / 2        y = self.start_point[1] + 40        w = 70          h = 80         return QRect(x, y, w, h)     def ey0_cacu(self):              # 计算眼0的坐标(圆角矩形)        x = self.start_point[0] + self.w / 2 - 70        y = self.start_point[1] + 40        w = 70          h = 80         return QRect(x, y, w, h) class collar(Shape):    #项圈    def draw(self):        linearGradient = QLinearGradient(140, 280, 140, 310)         #参数分别为中心坐标,半径长度和焦点坐标,        #如果需要对称那么中心坐标和焦点坐标要一致  #c93300        #辐射渐变色的效果,以整个图形区间为100%,        #分成多段设置颜色,各颜色按百分比分配。        linearGradient.setColorAt(0.2, QColor("#c40"))     #10%处         linearGradient.setColorAt(1.0, QColor("#800400"))   #        # linearGradient.setColorAt(1.0, Qt.black)   #100%处黑色        self.qp.setPen(QPen(Qt.black, 2))            #边线        self.qp.setBrush(linearGradient)       #设置画刷        self.qpp = QPainterPath()              #路径        self.qpp.moveTo(self.rect[0] + self.rect[2], self.rect[1] + 20)        self.qpp.arcTo(self.rect[0] + self.rect[2] - 10, self.rect[1] , 20.0, 20.0, 270.0, 180.0)  #(70, 30, R*2, R*2, 0, 180);(70,30)是起始位置,R是半径,270是起始角度,180是要画的角度        self.qpp.lineTo(self.rect[0], self.rect[1])        self.qpp.arcTo(self.rect[0]-10, self.rect[1], 20.0, 20.0, 90.0, 180.0)        self.qpp.closeSubpath()        self.qp.drawPath(self.qpp) class bell(Shape):    #铃铛    def draw(self):        #参数分别为中心坐标,半径长度和焦点坐标,        #如果需要对称那么中心坐标和焦点坐标要一致  #c93300        RadialGradient = QRadialGradient(270, 308, 40, 260, 300)  #辐射渐变        #辐射渐变色的效果,以整个图形区间为100%,        #分成多段设置颜色,各颜色按百分比分配。        RadialGradient.setColorAt(0.0, QColor("#f9f12a"))   #10%处白色         RadialGradient.setColorAt(0.75, QColor("#e9e11a"))   #60%处绿色 #07bbee        RadialGradient.setColorAt(1.0, QColor("#a9a100"))   #100%处黑色        self.qp.setPen(QPen(Qt.black, 2))            #边线        self.qp.setBrush(RadialGradient)       #设置画刷        self.qp.drawRoundedRect(self.rect, 90, 90, Qt.RelativeSize)  #画圆角矩形x1,y1,x2,y2,圆角的角度 class body(Shape):    #身体    def draw(self):        self.qp.setPen(QPen(Qt.black, 2))           #边线        self.qp.setBrush(self.color)       #设置画刷        self.qpp = QPainterPath()     #路径        self.qpp.moveTo(self.rect[0] + 228, self.rect[1] - 15)        self.qpp.lineTo(self.rect[0] + 230 + 45, self.rect[1] + 25)         self.qpp.lineTo(self.rect[0] + 230 + 20, self.rect[1] + 60)        self.qpp.lineTo(self.rect[0] + 230  - 2, self.rect[1] + 40)        self.qpp.lineTo(self.rect[0] + 230  - 2, self.rect[1] + 170)        self.qpp.arcTo(self.rect[0] + 105,self.rect[1] + 170-10, 20, 20, 0, 180)   #中间半圆        self.qpp.lineTo(self.rect[0] -2, self.rect[1] + 170)        self.qpp.lineTo(self.rect[0] - 2, self.rect[1] + 40)        self.qpp.lineTo(self.rect[0] - 20, self.rect[1] + 60)        self.qpp.lineTo(self.rect[0] - 40, self.rect[1] + 25)        self.qpp.lineTo(self.rect[0] + 2, self.rect[1] - 14)        self.qpp.closeSubpath()        self.qp.drawPath(self.qpp)  class foot(Shape):    #脚    def draw(self):        linearGradient = QLinearGradient(140, 280, 140, 310)         linearGradient.setColorAt(0.2, QColor("#c40"))     #10%处         linearGradient.setColorAt(1.0, QColor("#800400"))   #        # linearGradient.setColorAt(1.0, Qt.black)   #100%处黑色        self.qp.setPen(QPen(Qt.black, 2))            #边线        # self.qp.setBrush(linearGradient)       #设置画刷        self.qpp = QPainterPath()              #路径        self.qpp.moveTo(self.rect[0] + self.rect[2] - 40, self.rect[1] + self.rect[3] - 2)        self.qpp.arcTo(self.rect[0] + self.rect[2] - 40, self.rect[1] - 2 , 30.0, 30.0, 270.0, 180.0)  #(70, 30, R*2, R*2, 0, 180);(70,30)是起始位置,R是半径,270是起始角度,180是要画的角度        self.qpp.lineTo(self.rect[0], self.rect[1]-2)        self.qpp.arcTo(self.rect[0]-15, self.rect[1] - 3, 60.0, 40.0, 90.0, 125.0)        # self.qpp.arcTo(self.rect[0]-20, self.rect[1] + 26, 20.0, 20.0, 90.0, 30.0)        self.qpp.closeSubpath()        self.qp.drawPath(self.qpp) class hand(Shape):    #手    def draw(self):        self.qp.setBrush(self.color)       #设置画刷        self.qp.drawEllipse(self.rect)     #画圆形x,y,w,h  120, 25, 160, 160 class chest(Shape):    #白色肚兜    def draw(self):        self.color = Qt.white         self.qp.setPen(QPen(Qt.black, 2))           #边线        self.qp.setBrush(self.color)       #设置画刷        self.qpp = QPainterPath()     #路径        self.qpp.moveTo(self.rect[0] + 30 , self.rect[1] + 20)        self.qpp.arcTo(self.rect[0] , self.rect[1] , 170.0, 170.0, 130.0, 280.0)  #(70, 30, R*2, R*2, 0, 180);(70,30)是起始位置,R是半径,270是起始角度,180是要画的角度        self.qpp.closeSubpath()        self.qp.drawPath(self.qpp) class half(Shape):    #口袋    def draw(self):        self.color = Qt.white        self.qp.setPen(QPen(Qt.black, 2))           #边线        self.qp.setBrush(self.color)       #设置画刷        self.qpp = QPainterPath()     #路径        self.qpp.moveTo(self.rect[0] , self.rect[1] + 10)        self.qpp.arcTo(self.rect[0] , self.rect[1] - 55 , self.rect[2], self.rect[3], 180.0, 180.0)  #(70, 30, R*2, R*2, 0, 180);(70,30)是起始位置,R是半径,270是起始角度,180是要画的角度        self.qpp.closeSubpath()        self.qp.drawPath(self.qpp) class bellc(Shape):    #铃铛中心    def draw(self):        self.qp.setBrush(self.color)       #设置画刷        self.qp.drawEllipse(self.rect)       #画圆形x,y,w,h  120, 25, 160, 160 class bellv(Liner):    #铃铛竖线    def draw(self):        self.qp.drawLine(self.rect) class bellh(Liner):    #横线    # def __init__(self, qp, start_point, w, c=0):    #     self.qp = qp                            #     #     self.start_point = start_point          #起始坐标    #     self.w = w    #     self.c = c     def draw(self):        self.qp.drawLine(self.rect)  class Bells:                      # 铃铛组合    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.be = bell(self.qp, self.be_cacu(), QColor("#a9a100"))  #铃铛        self.bec = bellc(self.qp, self.bec_cacu(),Qt.black)         #铃铛中心        self.belv = bellv(self.qp, self.belv_cacu())      #铃铛竖线        self.belh2 = bellh(self.qp, self.belh2_cacu())         self.belh3 = bellh(self.qp, self.belh3_cacu())      def draw(self):        self.be.draw()        self.bec.draw()        self.belv.draw()        self.belh2.draw()        self.belh3.draw()     def belh2_cacu(self):              # 计算铃铛横线的坐标        x = self.start_point[0] + 2        y = self.start_point[1] -3        w = x + 36         h = y         return QLineF(x, y, w, h)     def belh3_cacu(self):              # 计算铃铛横线的坐标        x = self.start_point[0]         y = self.start_point[1] + 2        w = x + 40        h = y         return QLineF(x, y, w, h)     def belv_cacu(self):              # 计算铃铛竖线的坐标        x = self.start_point[0] + 20        y = self.start_point[1] + 20        w = x          h = y + 8        return QLineF(x, y, w, h)     def bec_cacu(self):              # 计算铃铛的坐标(圆角矩形)        x = self.start_point[0] + self.w /2 - 5        y = self.start_point[1] + 8        w = 10          h = 10        return QRect(x, y, w, h)     def be_cacu(self):              # 计算铃铛的坐标(圆角矩形)        x = self.start_point[0] + self.w /2 - 20        y = self.start_point[1] - 12        w = 40          h = 40        return QRect(x, y, w, h) class Bodys:                      # 身体组合    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.bod = body(self.qp, self.bod_cacu())        #实例化身体        self.che = chest(self.qp, self.che_cacu())       #实例化白色肚兜        self.ha = half(self.qp, self.ha_cacu())          #实例化口袋        self.coll = collar(self.qp, self.col_cacu())     # 实例化项圈        self.hnd0 = hand(self.qp, self.hnd0_cacu(), Qt.white)      #左手        self.hnd1 = hand(self.qp, self.hnd1_cacu(), Qt.white)      #左手        self.ft1 = foot(self.qp, self.ft1_cacu(), Qt.white)      #脚        self.ft2 = foot(self.qp, self.ft2_cacu(), Qt.white)      #脚        self.bels = Bells(self.qp, (240, 300), 40, 40)     def draw(self):                # 绘制        self.bod.draw()             #调用项圈方法绘制        self.che.draw()        self.ha.draw()        self.coll.draw()        self.hnd0.draw()        self.hnd1.draw()        self.ft1.draw()        self.ft2.draw()        self.bels.draw()     def ft1_cacu(self):              # 计算脚的坐标        x1 = self.start_point[0]         y1 = self.start_point[1] + 170        x2 = 120          y2 = 30        return (x1, y1, x2, y2)     def ft2_cacu(self):              # 计算脚的坐标(圆角矩形)        x1 = self.start_point[0] + 130        y1 = self.start_point[1] + 170        x2 = 120          y2 = 30        return (x1, y1, x2, y2)     def hnd0_cacu(self):              # 计算手的坐标(圆角矩形)        x = self.start_point[0] - 78        y = self.start_point[1] + 25        w = 60          h = 60        return QRect(x, y, w, h)     def hnd1_cacu(self):              # 计算手的坐标(圆角矩形)        x = self.start_point[0] + self.h + 20        y = self.start_point[1] + 25        w = 60          h = 60        return QRect(x, y, w, h)     def ha_cacu(self):              # 计算口袋的坐标(圆角矩形)        x = self.start_point[0] + 48        y = self.start_point[1] + 40        w = 130          h = 130        return (x, y, w, h)     def che_cacu(self):              # 计算白色肚兜的坐标(圆角矩形)        x = self.start_point[0] + 28        y = self.start_point[1] - 30        w = 170          h = 170        return (x, y, w, h)     def col_cacu(self):              # 计算项圈的坐标(圆角矩形)        x1 = self.start_point[0]         y1 = self.start_point[1] - 20        x2 = 230          y2 = 20        return (x1, y1, x2, y2)     def bod_cacu(self):              # 计算身体的坐标        x = self.start_point[0]         y = self.start_point[1]         w = 230          h = 165         return (x, y, w, h) class Example(QWidget):    def __init__(self, w, h):        super().__init__()        self.qp = QPainter()     # 画笔实例        self.rect = QRect()        self.color = QColor()        self.start_point = (100,30)   #头部的起始位置        self.w = w        self.h = h        self.initUI()        self.heads = Heads(self.qp,self.start_point, 320, 300)  # w,h        self.bo = Bodys(self.qp, (145,300), 230, 230)  #start_point,w,h     def initUI(self):        self.setGeometry(100, 300, self.w, self.h)  # 窗口在屏幕上的坐标和大小:x,y,w,h        self.setWindowTitle('叮当猫')        self.show()        # rect = QRect(120, 25, 160, 160)        # self.hd = head(self.qp, self.rect, self.color)     def paintEvent(self, e):        self.qp.begin(self)        self.drawBrushes(self.qp)  #调用方法        self.qp.end()     def drawBrushes(self, qp):        self.heads.draw()        self.bo.draw()        # brush.setStyle(Qt.Dense1Pattern)   #设置style        # qp.setBrush(brush)                 #设置画刷        # self.qp.drawEllipse(self.rect, self.color)       #画矩形x,y,w,h         if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example(520, 760)       #窗体大小    sys.exit(app.exec_())

关于"Python如何绘制多啦A梦叮当猫"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0