Python实现画图软件功能方法详解


Posted in Python onJuly 28, 2020

概述

虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户界面)方面的应用,仅供学习分享使用,如有不足之处,还请指正。

设计思路

  • 页面布局:主要分为上下两部分 a. 绘图区域,本例以Canvas实现 b. 下部:功能区,由按钮实现
  • 事件监听:通过给功能按钮绑定事件,来实现不同的功能,如:绘线,绘矩形等功能。
  • 绘图区域:监听鼠标左键的按下(开始绘图)和抬起(停止绘图),再根据不同的按钮实现绘制不同的图形。

涉及知识点

开发工具:Python3.7 , PyCharm2019

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

Canvas控件提供了一个自定义的绘图区域,可以通过不同的函数来绘制不同的图形。
绘制直线 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)
绘制曲线,是通过绘制不同的点来实现的
清除图形 drawpad.delete('all')

Button 按钮控件,通过绑定(bind)不同的监听事件来实现不同的功能。
name属性设置按钮的名称,
text属性设置按钮的显示文本。
bind 绑定事件

示例效果图

本例主要实现绘制直线,带箭头的直线,曲线,矩形,清除等功能,如下所示:

Python实现画图软件功能方法详解

核心代码

在本例中,主要功能如下:

创建画板

"""创建画图区域"""
 self.drawpad = Canvas(self, width=win_width, height=win_height, bg=bgcolor)
 self.drawpad.pack()

创建按钮

# 创建按钮
  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) # 点击按钮事件

功能实现

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

快捷键的实现

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) # 左键释放按钮

快捷键功能实现

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'

有需要的朋友,可点击链接下载整体代码,如下所示:

 备注

不积跬步,无以至千里;不积小流,无以成江海;锲而舍之,朽木不折,锲而不舍,金石可镂。

到此这篇关于 Python实现画图软件功能方法详解的文章就介绍到这了,更多相关 Python实现画图软件功能内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python基本数据类型详细介绍
Mar 11 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
python处理PHP数组文本文件实例
Sep 18 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Pycharm远程调试openstack的方法
Nov 21 Python
python在非root权限下的安装方法
Jan 23 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
Cython编译python为so 代码加密示例
Dec 23 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
python自动化八大定位元素讲解
Jul 09 Python
Python绘图之柱形图绘制详解
Jul 28 #Python
Python如何定义接口和抽象类
Jul 28 #Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 #Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 #Python
用python写爬虫简单吗
Jul 28 #Python
公认8个效率最高的爬虫框架
Jul 28 #Python
python如何爬取网页中的文字
Jul 28 #Python
You might like
用PHP发电子邮件
2006/10/09 PHP
用Flash图形化数据(一)
2006/10/09 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
node内置调试方法总结
2018/02/22 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
python 字符串split的用法分享
2013/03/23 Python
python实现的简单抽奖系统实例
2015/05/22 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
python 贪心算法的实现
2020/09/18 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
演讲稿的写法
2014/05/19 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书