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

概述

虽然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 绑定事件

示例效果图

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

核心代码

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

创建画板

 """创建画图区域"""
 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实现画图软件功能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-28

基于python脚本实现软件的注册功能(机器码+注册码机制)

一.前言: 目的:完成已有python图像处理工具的注册功能 功能:用户运行程序后,通过文件自动检测认证状态,如果未经认证,就需要注册.注册过程是用户将程序运行后显示的机器码(C盘的卷序号)发回给管理员,管理员对机器码加密后生成加密文件或字符串返回给用户.每次启动程序,在有注册文件的情况下,程序就会通过DES和base64解码,并与此刻获取到的C盘卷序列号比对,如果一致则运行主程序.如果注册文件解码后与卷序号不一致,就要提醒用户输入注册码,如果对新输入的解码后和重新获取的机器码一致,则通过认证,

python自动12306抢票软件实现代码

昨天我发的是抓取的12306数据包,然后分析了一下,今天按照昨天的分析 用代码实现了,如果有需要的同学们可以看一下,实现的功能有,登录,验证码识别,自动查票,有余票点击预定, 差了最后一步提交订单.同学们可以自己研究一下. import requests import time import dmpt import re import random from copyheaders import headers_raw_to_dict DEFAULT_HEADERS={ 'Host':'kyfw

python写一个随机点名软件的实例

最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix Wang from tkinter import * import tkinter.font as tkFont import random import gc import os, sys import chardet import copy from threading import Thre

Python实战之制作天气查询软件

前言 本文主要给大家介绍的是关于Python制作天气查询软件,下面话不多说了,来一起看看详细的介绍吧 效果图 以前,给大家分享了如何使用 PyQt5 制作猜数游戏和计时器,这一次,我们继续学习:如何使用 PyQt5 制作天气查询软件. 源代码和 exe 文件: github 地址:https://github.com/xflywind/Python-Application 本地下载:http://xiazai.jb51.net/201905/yuanma/weather-python(jb51.

python代码能做成软件吗

我们首先还是使用pip进行安装: pip install PyInstaller 安装完成后,直接打开命令行,输入pyinstaller,如果显示如下界面,说明安装成功. 然后就可以进行我们小程序的封装了. pyinstaller -F -w some.py -F与-w的含义: -F:将所有内容全部打包成一个exe可执行文件,而不会有其它的一些奇奇怪怪的小依赖文件. -w:运行生成的exe文件时,不会弹出命令行窗口,我们自己写了窗口才可以否则无法运行. 运行完之后,桌面上就会弹出一个dist文件

python程序变成软件的实操方法

本人新学python,发现python程序转成软件好麻烦,为了方便大家,同时自己整理下资源,发布以下教程哦. 下载 "pywin32"软件,选择最新的build文件夹,支持新版本的python 下载完毕后进行安装,需要相应版本的python作为支持 安装完成后,打开cmd,输入"pip install pywin32",如果pywin32程序老旧,会提示你输入 "python -m pip install --upgrade pip"命令自动更新

使用python制作一个解压缩软件

python实现解压缩的重要模块就是--zipfile,其次是os 安装zipfile模块 首先得安装zipfile模块,打开cmd输入一下命令即可安装 pip install zipfile os是python自带的库,所以无需另外安装,直接 import 即可 编写核心代码 压缩文件核心代码: def zip_file(): zip_name = path.get() +'.zip' # 获取绝对路径然后给压缩文件加上.zip结尾 z = zipfile.ZipFile(zip_name,'

使用Python制作一个打字训练小工具

一.写在前面 说道程序员,你会想到什么呢?有人认为程序员象征着高薪,有人认为程序员都是死肥宅,还有人想到的则是996和 ICU. 别人眼中的程序员:飞快的敲击键盘.酷炫的切换屏幕.各种看不懂的字符代码. 然而现实中的程序员呢?对于很多程序员来说,没有百度和 Google 解决不了的问题,也没有 ctrl + c 和 ctrl + v 实现不了的功能. 那么身为一个程序员,要怎么让自己看起来更加"专业"呢?答案就是加快自己的打字速度了,敲的代码可能是错的,但这个13却是必须装的! 然而还

Python制作一个仿QQ办公版的图形登录界面

最近,QQ的办公版本--TIM进行了一次更新升级.本次更新升级大幅修改了界面的样式,看起来更加的清爽.简洁和高效了. 这种界面州的先生还是比较喜欢的,没有QQ那么花里胡哨,也比微信那些残缺的功能更加丰富. 并且这次的登录界面还新增了微信登录的选项,看来 TIM 还打算从微信那边争取一部分用户过来. 闲话少说,进入正题. 州的先生看到这个出自大厂的图形界面程序,不由得想用 Python 的图形界面模块来实现一个.在上古时代,前端开发还是被称为"切图仔"的岗位,那时候的一个练手方式就是使用

使用python制作一个为hex文件增加版本号的脚本实例

最近公司一个项目需要用到IAP升级,要求将APP的版本号在hex文件添加,于是尝试用python写一个脚本,运行之后可以自动增加版本号,并且日期都是当天的 import re import time #获取日期的数据及校验和 year = int(time.strftime("%y", time.localtime())) month = int(time.strftime("%m", time.localtime())) date = int(time.strft

小白如何入门Python? 制作一个网站为例

首先最重要的问题是为什么要学习python?这个问题这个将指导你如何学习Python和学习的方式. 以你最终想制作一个网站为例.从一个通用的学习资源列表开始不仅会消磨你的激情,而且你获得的知识很难应用,我曾经尝试过不通过上下文和具体应用来学习编程,但是我几乎没有获得任何有用的技能. 当我3年前学习python时,我想创建一个网站.这对于任何一个学习Pyhon人来说,不足为奇. 1.找到是什么激励你 找到并保持你的动机是关键-我高中睡了很多个的程序设计课,因为它只让我们记住了一堆语法.另一方面,当

python制作一个桌面便签软件

# 2014.10.15 更新了memo.zip, 网盘的exe:修复:1.隔日启动不能正常加载json,加入:1.隐藏任务栏图标,2.通过垃圾桶进行窗口移动. # 2014.10.8 10.36更新了memo.zip # 2014.10.8 13.17 更新了memo.zip 在win10测试,基本没问题 运行widget.py文件. ubuntu: 在ubuntu上,memo.desktop文件可以放在desktop文件夹中,chmod +x,自己修改文件中对应的路径(很容易的).即可用作桌

如何利用Python开发一个简单的猜数字游戏

前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)"还是"小(low)",如此往复直到玩家猜对数字. 准备好Python3 首先,需要在计算机上安装Python.可以从Python官网下载并安装.本教程需要使用最新版的Python 3(版本3.x.x). 确保选中将Python添加到PATH变量的框.如果不这样做,将很难运行该程序.

小 200 行 Python 代码制作一个换脸程序

简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: 检测脸部标记. 旋转.缩放.平移和第二张图片,以配合第一步. 调整第二张图片的色彩平衡,以适配第一张图片. 把第二张图像的特性混合在第一张图像中. 1.使用 dlib 提取面部标记 该脚本使用 dlib 的 Python 绑定来提取面部标记: Dlib 实现了 Vahid Kazemi 和 Josephine Sullivan 的<使用回归树一毫秒脸部对准>