Python实现画图软件功能

简介: 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'

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

源码链接

备注

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

相关文章
|
10天前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
1月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
43 6
|
2月前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
43 7
|
22天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
55 20
|
1月前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
44 11
|
1月前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
19天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
52 0
|
2月前
|
设计模式 监控 程序员
Python中的装饰器:功能增强与代码复用的利器####
本文深入探讨了Python中装饰器的工作原理、应用场景及其在提升代码可读性、减少重复劳动方面的优势。不同于传统方法的冗长和复杂,装饰器提供了一种优雅且高效的方式来增强函数或方法的功能。通过具体实例,我们将揭示装饰器如何简化错误处理、日志记录及性能监控等常见任务,使开发者能够专注于核心业务逻辑的实现。 ####
|
2月前
|
机器人 计算机视觉 Python
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
61 5
|
2月前
|
开发框架 缓存 测试技术
Python中的装饰器:魔法般的功能增强
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者修改或扩展函数和类的行为。本文将深入探讨Python装饰器的工作原理,并通过实例演示如何创建和使用自定义装饰器来增强代码的功能性和可读性。我们将从基础概念讲起,逐步深入到高级应用,揭示装饰器背后的“魔法”,并展示它们在实际开发中的多种用途。