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高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Python入门篇之字符串
Oct 17 Python
python实现的jpg格式图片修复代码
Apr 21 Python
python 第三方库的安装及pip的使用详解
May 11 Python
Python Flask-web表单使用详解
Nov 18 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python 猴子补丁(monkey patch)
Jun 26 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
pandas 空数据处理方法详解
Nov 02 Python
TensorFlow的环境配置与安装方法
Feb 20 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除数取整示例
2014/04/24 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
PHP异常处理Exception类
2015/12/11 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
javascript实现文件拖拽事件
2018/03/29 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
Python的一些用法分享
2012/10/07 Python
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
跟老齐学Python之复习if语句
2014/10/02 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
《月球之谜》教学反思
2014/04/10 职场文书
我爱读书演讲稿
2014/05/07 职场文书
项目投资合作意向书
2014/07/29 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
学习保证书
2015/01/17 职场文书
工资证明范本
2015/06/12 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js