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使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
Python 日志logging模块用法简单示例
Oct 18 Python
python命令 -u参数用法解析
Oct 24 Python
利用Python脚本实现自动刷网课
Feb 03 Python
tensorflow之读取jpg图像长和宽实例
Jun 18 Python
python操作toml文件的示例代码
Nov 27 Python
python中温度单位转换的实例方法
Dec 27 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入门之连接mysql数据库的一个类
2012/04/21 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
python提示No module named images的解决方法
2014/09/29 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
pycharm 安装JPype的教程
2019/08/08 Python
Django配置文件代码说明
2019/12/04 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
python自动下载图片的方法示例
2020/03/25 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
python GUI模拟实现计算器
2020/06/22 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
大学毕业生通用求职信
2013/09/28 职场文书
电工技术比武方案
2014/05/11 职场文书
2014年业务工作总结
2014/11/17 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL