一步步教你怎么用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