一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python畫圖小案例之小雪人超詳細源碼注釋

Python畫圖小案例之小雪人超詳細源碼注釋

2022-01-17 10:32zhulin1028 Python

在看了很多Python教程之后,覺得是時候做點什么小項目來練練手了,于是想來想去,用python寫了一個小雪人,代碼注釋無比詳細清楚,快來看看吧

一步步教你怎么用Python畫雪人,進一步熟悉Python的基礎畫圖操作,廢話不多說,上代碼。

希望您給個關注給個贊,也算對我們的支持了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
class Shape:     # 基類(雪人各部件(形狀)共有的屬性)
    def __init__(self, cvns, points, fill):     # 構造方法  畫布  位置坐標  顏色
         self.cvns = cvns                 # 畫布
         self.points = points             # 坐標(x1, y1, x2, y2)
         self.fill = fill
         self.pid = None                  # 當前圖形的id
 
    def 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,fill
        self.angles = {'start':angles[0], 'extent':angles[1]}  # 構造自己的屬性:angles
 
 
class 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_point
        self.w = w
        self.fill = fill
        self.h = h
        self.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 / 2
        x1 = self.start_point[0] + self.w / 2 - r
        y1 = self.start_point[1] + 20 - r
        x2 = x1 + 2 * r
        y2 = y1 + 2 * r
        return x1, y1, x2, y2
 
    def hb_cacu(self):              # 計算底部坐標(三角形的三個點的坐標)
        x1 = self.start_point[0] + self.w / 2
        y1 = self.start_point[1] + self.h / 3
        x2 = self.start_point[0] + self.w / 3
        y2 = self.start_point[1] + self.h + 13
        x3 = self.start_point[0] + self.w / 3 * 2
        y3 = y2
        return x1, y1, x2, y2, x3, y3
 
 
class Sense(ShapeAngles):                # 五官(眼、口扇形圖形)
    def draw(self):
        self.pid = self.cvns.create_arc(*self.points, **self.angles, fill='red')    # 繪制弧線
 
class Face(HatTop):   # 臉
    pass
 
 
class Head:         # 頭部
    def __init__(self, cvns, start_point, fill, w, h):    # 此處的w,h是頭的
        self.cvns = cvns
        self.start_point = start_point
        self.fill = fill
        self.w = w
        self.h = h
        eye0_points = self.eye0_cacu()     # 眼睛1坐標
        dx = self.h / 3 + self.h / 9
        eye1_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) / 2
        y1 = self.start_point[1]
        x2 = x1 + self.h
        y2 = y1 + self.h
        return x1, y1, x2, y2
 
    def 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 / 6
        y1 = left_point[1] + self.h / 3
        x2 = x1 + self.h / 3
        y2 = left_point[1] + self.h / 2
        return x1, y1, x2, y2
 
    def mouth_cacu(self):            # 口坐標計算
        left_point = (self.start_point[0] + (self.w - self.h) / 2, self.start_point[1])
        x1 = left_point[0] + self.h / 3
        y1 = left_point[1] + 2 * self.h / 3 + 25      # +25后口的位置靠下,并且圖形更大了
        x2 = x1 + self.h / 3
        y2 = left_point[1] + self.h / 2
        return x1, y1, x2, y2
 
 
class hand(HatTop):            # 手
    pass
 
 
class BodyOutline(HatTop):      # 身體輪廓,因沒有特別的形狀,繼承了基類,類體為空
    pass
 
 
class Button(HatTop):            # 鈕扣
    pass
 
class Body:                      # 身體
 
    def __init__(self, cvns, start_point, fill, w, h):
        self.cvns = cvns
        self.start_point = start_point
        self.w = w
        self.h = h
        self.fill = fill
        self._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 + w
        y1 = self.start_point[1] + self.h / 2
        x2 = x1 + 30
        y2 = y1 - 26 * self._button_size
        return x1, y1, x2, y2
 
    def 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_point
        x2 = x1 + self.w
        y2 = y1 + self.h
        return x1, y1, x2, y2
 
    def button0_cacu(self):        # 計算第0個鈕扣的坐標
        x1 = self.start_point[0] + self.w / 2 - self._button_size
        y1 = self.start_point[1] + self.h / 5 - self._button_size
        x2 = x1 + 2 * self._button_size         # 2決定鈕扣的園形形狀
        y2 = y1 + 2 * self._button_size
        return x1, y1, x2, y2
 
    def move_dy(self, points, size):   # 鈕扣移動的方法
        y1 = points[1] + size
        y2 = points[3] + size
        return points[0], y1, points[2], y2
 
    def all_button_points(self):          # 繪制每個鈕扣的坐標
        b0_points = self.button0_cacu()
        size = self.h / 6                   # 身高/鈕扣數+1
        points = []                         # 列表
        for i in range(5):                 # 鈕扣的個數
            points.append(self.move_dy(b0_points, i * size))   # 各鈕扣的移動數據存入列表points
        return points                   # 返回列表值
 
    # def set_button_size(self, size):
    #     self._button_size = size
 
 
class Snow:           # 組裝成雪人
 
    def __init__(self, cvns, points, fill, w=150, h=450):       # points為雪人的坐標其與帽子坐標一致(見雪人圖)
        self.cvns = cvns
        self.points = points
        self.w = w
        self.h = h
        self.fill = fill
        self.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 tkinter
    root = 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畫圖小案例之小雪人超詳細源碼注釋的文章就介紹到這了,更多相關Python 雪人 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/xiejiachao/article/details/120536554

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久三级视频 | 免费高清视频日本 | 国语自产拍在线播放不卡 | 女女同性做爰xxoo亲吻 | 91短视频在线免费观看 | 色图图片| 国产成人精选免费视频 | 2019年国产不卡在线刷新 | 日本指交| 日韩视频在线免费观看 | 小小水蜜桃视频高清在线观看免费 | 亚洲成人黄色网址 | 69成人网 | 欧美日韩亚洲高清不卡一区二区三区 | 欧美8x8x| 国产nv精品你懂得 | 九九国产在线 | 星星动漫在线观看无删减 | 亚洲第一天堂网 | 免费观看a毛片一区二区不卡 | 91免费在线播放 | 91桃色污 | 成人免费体验区福利云点播 | 成人伊人亚洲人综合网站222 | а天堂中文最新版在线 | 欧美一区二区三区综合色视频 | 好姑娘完整版在线观看中文 | 欧美日韩亚洲综合在线一区二区 | 久久精品人人做人人爽97 | juliaann大战黑人 | 扒开女人下面使劲桶屁股动漫 | 国产丰满美女做爰 | 99热在线获取最新地址 | 欧美bbb人妖| 日韩欧美成末人一区二区三区 | 男女羞羞的视频 | 精品视频二区 | 青青草综合网 | 成人性用品| 特级毛片免费视频观看 | 免费观看大片毛片 |