Python實現(xiàn)畫圖軟件功能方法詳解
概述
雖然Python的強(qiáng)項在人工智能,數(shù)據(jù)處理方面,但是對于日常簡單的應(yīng)用,Python也提供了非常友好的支持(如:Tkinter),本文主要一個簡單的畫圖小軟件,簡述Python在GUI(圖形用戶界面)方面的應(yīng)用,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。
設(shè)計思路
- 頁面布局:主要分為上下兩部分 a. 繪圖區(qū)域,本例以Canvas實現(xiàn) b. 下部:功能區(qū),由按鈕實現(xiàn)
- 事件監(jiān)聽:通過給功能按鈕綁定事件,來實現(xiàn)不同的功能,如:繪線,繪矩形等功能。
- 繪圖區(qū)域:監(jiān)聽鼠標(biāo)左鍵的按下(開始繪圖)和抬起(停止繪圖),再根據(jù)不同的按鈕實現(xiàn)繪制不同的圖形。
涉及知識點
開發(fā)工具:Python3.7 , PyCharm2019
Tkinter 是 Python 的標(biāo)準(zhǔn) GUI 庫。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序。
Canvas控件提供了一個自定義的繪圖區(qū)域,可以通過不同的函數(shù)來繪制不同的圖形。
繪制直線 create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
繪制帶箭頭的直線 create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)
繪制矩形 create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)
繪制曲線,是通過繪制不同的點來實現(xiàn)的
清除圖形 drawpad.delete('all')
Button 按鈕控件,通過綁定(bind)不同的監(jiān)聽事件來實現(xiàn)不同的功能。
name屬性設(shè)置按鈕的名稱,
text屬性設(shè)置按鈕的顯示文本。
bind 綁定事件
示例效果圖
本例主要實現(xiàn)繪制直線,帶箭頭的直線,曲線,矩形,清除等功能,如下所示:

核心代碼
在本例中,主要功能如下:
創(chuàng)建畫板
"""創(chuàng)建畫圖區(qū)域""" self.drawpad = Canvas(self, width=win_width, height=win_height, bg=bgcolor) self.drawpad.pack()
創(chuàng)建按鈕
# 創(chuàng)建按鈕 self.btn_start = Button(self, name='start', text='開始') self.btn_start.pack(side='left', padx=10) self.btn_pen = Button(self, name='pen', text='畫筆') self.btn_pen.pack(side='left', padx=10) self.btn_rect = Button(self, name='rect', text='矩形') self.btn_rect.pack(side='left', padx=10) self.btn_clear = Button(self, name='clear', text='清屏') self.btn_clear.pack(side='left', padx=10) self.btn_erasor = Button(self, name='erasor', text='橡皮擦') self.btn_erasor.pack(side='left', padx=10) self.btn_line = Button(self, name='line', text='直線') self.btn_line.pack(side='left', padx=10) self.btn_line_arrow = Button(self, name='line_arrow', text='箭頭直線') self.btn_line_arrow.pack(side='left', padx=10) self.btn_color = Button(self, name='color', text='顏色') self.btn_color.pack(side='left', padx=10)
綁定事件
# 綁定事件
self.btn_line.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
self.btn_line_arrow.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
self.btn_rect.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
self.btn_pen.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
self.btn_erasor.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
self.btn_clear.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
self.btn_color.bind('<Button-1>', self.eventManager) # 點擊按鈕事件
功能實現(xiàn)
def eventManager(self, event):
name = event.widget.winfo_name()
print(name)
self.start_flag = True
if name == 'line':
# 左鍵拖動
self.drawpad.bind('<B1-Motion>', self.myline)
elif name == 'line_arrow':
self.drawpad.bind('<B1-Motion>', self.myline_arrow)
elif name == 'rect':
self.drawpad.bind('<B1-Motion>', self.myrect)
elif name == 'pen':
self.drawpad.bind('<B1-Motion>', self.mypen)
elif name == 'erasor':
self.drawpad.bind('<B1-Motion>', self.myerasor)
elif name == 'clear':
self.drawpad.delete('all')
elif name == 'color':
c = askcolor(color=self.fgcolor, title='請選擇顏色')
print(c) # c的值 ((128.5, 255.99609375, 0.0), '#80ff00')
self.fgcolor = c[1]
def startDraw(self, event):
self.drawpad.delete(self.lastdraw)
if self.start_flag:
self.start_flag = False
self.x = event.x
self.y = event.y
def stopDraw(self, event):
self.start_flag = True
self.lastdraw = 0
def myline(self, event):
self.startDraw(event)
self.lastdraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
def myline_arrow(self, event):
self.startDraw(event)
self.lastdraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)
def myrect(self, event):
self.startDraw(event)
self.lastdraw = self.drawpad.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)
def mypen(self, event):
self.startDraw(event)
print('self.x=', self.x, ',self.y=', self.y)
self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
self.x = event.x
self.y = event.y
def myerasor(self, event):
self.startDraw(event)
print('self.x=', self.x, ',self.y=', self.y)
self.drawpad.create_rectangle(event.x - 3, event.y - 3, event.x + 3, event.y + 3, fill=bgcolor)
self.x = event.x
self.y = event.y
快捷鍵的實現(xiàn)
self.master.bind('<KeyPress-r>', self.hotKey) # 綁定快捷鍵
self.master.bind('<KeyPress-g>', self.hotKey) # 綁定快捷鍵
self.master.bind('<KeyPress-b>', self.hotKey) # 綁定快捷鍵
self.master.bind('<KeyPress-y>', self.hotKey) # 綁定快捷鍵
self.drawpad.bind('<ButtonRelease-1>', self.stopDraw) # 左鍵釋放按鈕
快捷鍵功能實現(xiàn)
def hotKey(self, event): c = event.char if c == 'r': self.fgcolor = 'red' elif c == 'g': self.fgcolor = 'green' elif c == 'b': self.fgcolor = 'blue' elif c == 'y': self.fgcolor = 'yellow'
有需要的朋友,可點擊鏈接下載整體代碼,如下所示:
備注
不積跬步,無以至千里;不積小流,無以成江海;鍥而舍之,朽木不折,鍥而不舍,金石可鏤。
到此這篇關(guān)于 Python實現(xiàn)畫圖軟件功能方法詳解的文章就介紹到這了,更多相關(guān) Python實現(xiàn)畫圖軟件功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你使用Sublime text3搭建Python開發(fā)環(huán)境及常用插件安裝另分享Sublime text3最新激活注冊碼
這篇文章主要介紹了使用Sublime text 3搭建Python開發(fā)環(huán)境及常用插件安裝,并提供了最新Sublime text 3激活注冊碼需要的朋友可以參考下2020-11-11
cv2.imread?和?cv2.imdecode?用法及區(qū)別
對于路徑中含有中文的圖像,直接用cv2.imread讀取會報錯,上次看到有大佬使用cv2.imdecode就可以正常讀取,有點好奇,所以今天來記錄下二者用法和區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-02-02
Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能
這篇文章主要給大家介紹了關(guān)于Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能的相關(guān)資料,在Python環(huán)境下,利用百度AI開放平臺文字識別技術(shù),對表格類圖片進(jìn)行識別,需要的朋友可以參考下2021-09-09
Python數(shù)據(jù)分析庫pandas基本操作方法
下面小編就為大家分享一篇Python數(shù)據(jù)分析庫pandas基本操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

