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实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
使用Python生成XML的方法实例
Mar 21 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
python递归实现快速排序
Aug 18 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
python中对_init_的理解及实例解析
Oct 11 Python
python函数不定长参数使用方法解析
Dec 14 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
pycharm 关掉syntax检查操作
Jun 09 Python
浅谈Python描述数据结构之KMP篇
Sep 06 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/11/23 PHP
基于php权限分配的实现代码
2013/04/28 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
小小聊天室Python代码实现
2016/08/17 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python日志logging模块使用方法分析
2019/05/23 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
求职信的七个关键技巧
2014/02/05 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
小学生环保演讲稿
2014/04/25 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
一文搞懂Java中的注解和反射
2022/06/21 Java/Android