Python畫圖小案例之小雪人超詳細源碼註釋
一步步教你怎麼用Python畫雪人,進一步熟悉Python的基礎畫圖操作,廢話不多說,上代碼。
希望您給個關註給個贊,也算對我們的支持瞭。
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 雪人 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python畫圖小案例之多啦A夢叮當貓超詳細註釋
- Python實現五子棋人機對戰 和人人對戰
- 基於Python實現五子棋-(人機對戰)
- 用python畫一隻帥氣的皮卡丘
- python遊戲實戰項目之智能五子棋簡易版