亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)現(xiàn)畫圖軟件功能方法詳解

 更新時(shí)間:2020年07月28日 17:31:20   作者:Alan.hsiang  
這篇文章主要介紹了 Python實(shí)現(xiàn)畫圖軟件功能方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

雖然Python的強(qiáng)項(xiàng)在人工智能,數(shù)據(jù)處理方面,但是對于日常簡單的應(yīng)用,Python也提供了非常友好的支持(如:Tkinter),本文主要一個(gè)簡單的畫圖小軟件,簡述Python在GUI(圖形用戶界面)方面的應(yīng)用,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。

設(shè)計(jì)思路

  • 頁面布局:主要分為上下兩部分 a. 繪圖區(qū)域,本例以Canvas實(shí)現(xiàn) b. 下部:功能區(qū),由按鈕實(shí)現(xiàn)
  • 事件監(jiān)聽:通過給功能按鈕綁定事件,來實(shí)現(xiàn)不同的功能,如:繪線,繪矩形等功能。
  • 繪圖區(qū)域:監(jiān)聽鼠標(biāo)左鍵的按下(開始繪圖)和抬起(停止繪圖),再根據(jù)不同的按鈕實(shí)現(xiàn)繪制不同的圖形。

涉及知識(shí)點(diǎn)

開發(fā)工具:Python3.7 , PyCharm2019

Tkinter 是 Python 的標(biāo)準(zhǔn) GUI 庫。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序。

Canvas控件提供了一個(gè)自定義的繪圖區(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)
繪制曲線,是通過繪制不同的點(diǎn)來實(shí)現(xiàn)的
清除圖形 drawpad.delete('all')

Button 按鈕控件,通過綁定(bind)不同的監(jiān)聽事件來實(shí)現(xiàn)不同的功能。
name屬性設(shè)置按鈕的名稱,
text屬性設(shè)置按鈕的顯示文本。
bind 綁定事件

示例效果圖

本例主要實(shí)現(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) # 點(diǎn)擊按鈕事件
  self.btn_line_arrow.bind('<Button-1>', self.eventManager) # 點(diǎn)擊按鈕事件
  self.btn_rect.bind('<Button-1>', self.eventManager) # 點(diǎn)擊按鈕事件
  self.btn_pen.bind('<Button-1>', self.eventManager) # 點(diǎn)擊按鈕事件
  self.btn_erasor.bind('<Button-1>', self.eventManager) # 點(diǎn)擊按鈕事件
  self.btn_clear.bind('<Button-1>', self.eventManager) # 點(diǎn)擊按鈕事件
  self.btn_color.bind('<Button-1>', self.eventManager) # 點(diǎn)擊按鈕事件

功能實(shí)現(xiàn)

def eventManager(self, event):
  name = event.widget.winfo_name()
  print(name)
  self.start_flag = True
  if name == 'line':
   # 左鍵拖動(dòng)
   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

快捷鍵的實(shí)現(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) # 左鍵釋放按鈕

快捷鍵功能實(shí)現(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'

有需要的朋友,可點(diǎn)擊鏈接下載整體代碼,如下所示:

源碼鏈接

 備注

不積跬步,無以至千里;不積小流,無以成江海;鍥而舍之,朽木不折,鍥而不舍,金石可鏤。

到此這篇關(guān)于 Python實(shí)現(xiàn)畫圖軟件功能方法詳解的文章就介紹到這了,更多相關(guān) Python實(shí)現(xiàn)畫圖軟件功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python3.7 讀取 mp3 音頻文件生成波形圖效果

    Python3.7 讀取 mp3 音頻文件生成波形圖效果

    這篇文章主要介紹了Python3.7 讀取 mp3 音頻文件生成波形圖小編,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python?pygame實(shí)現(xiàn)五子棋雙人聯(lián)機(jī)

    python?pygame實(shí)現(xiàn)五子棋雙人聯(lián)機(jī)

    這篇文章主要為大家詳細(xì)介紹了python?pygame實(shí)現(xiàn)五子棋雙人聯(lián)機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python報(bào)錯(cuò)ValueError:?cannot?convert?float?NaN?to?integer的解決方法

    Python報(bào)錯(cuò)ValueError:?cannot?convert?float?NaN?to?intege

    在Python編程中,我們經(jīng)常需要處理各種數(shù)據(jù)類型,包括浮點(diǎn)數(shù)和整數(shù),然而,有時(shí)候我們可能會(huì)遇到一些意外的情況,比如將一個(gè)包含NaN(Not?a?Number)的浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)時(shí),就會(huì)拋出錯(cuò)誤,本文將探討這個(gè)錯(cuò)誤的原因,并給出幾種可能的解決方案,需要的朋友可以參考下
    2024-09-09
  • 七種Python代碼審查工具推薦

    七種Python代碼審查工具推薦

    這篇文章主要介紹了七種Python代碼審查工具推薦,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Jupyter Notebook折疊輸出的內(nèi)容實(shí)例

    Jupyter Notebook折疊輸出的內(nèi)容實(shí)例

    這篇文章主要介紹了Jupyter Notebook折疊輸出的內(nèi)容實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Linux下python制作名片示例

    Linux下python制作名片示例

    這篇文章主要介紹了Linux下python制作名片示例的相關(guān)資料,需要的朋友可以參考下
    2018-07-07
  • python函數(shù)中return后的語句一定不會(huì)執(zhí)行嗎?

    python函數(shù)中return后的語句一定不會(huì)執(zhí)行嗎?

    這篇文章主要給大家詳細(xì)分析講解了關(guān)于python函數(shù)中return語句后的語句是否一定不會(huì)執(zhí)行的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • python 自動(dòng)刷新網(wǎng)頁的兩種方法

    python 自動(dòng)刷新網(wǎng)頁的兩種方法

    這篇文章主要介紹了python 自動(dòng)刷新網(wǎng)頁的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python web.py開發(fā)httpserver解決跨域問題實(shí)例解析

    python web.py開發(fā)httpserver解決跨域問題實(shí)例解析

    這篇文章主要介紹了python web.py開發(fā)httpserver解決跨域問題實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 使用python繪制cdf的多種實(shí)現(xiàn)方法

    使用python繪制cdf的多種實(shí)現(xiàn)方法

    今天小編就為大家分享一篇使用python繪制cdf的多種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論