Python基于Tkinter实现简易画图软件详解

Noah
Noah
发布时间:2026-10-15 | 1人浏览过
原创

本文详细介绍如何使用Python标准库Tkinter和Canvas控件开发一款简易画图软件。通过解析页面布局、事件监听及核心代码,演示如何绘制直线、矩形、曲线及实现快捷键功能,为Python图形界面应用提供实用参考。

概述与设计思路

概述

尽管Python在人工智能与数据处理领域占据主导地位,但在日常轻量级应用开发中同样表现优异,例如通过Tkinter库即可快速构建图形用户界面。本文旨在通过一个基础画图软件的开发案例,简要阐述Python在GUI(图形用户界面)开发中的实际应用,内容仅供学习参考,如有疏漏欢迎指正。

设计思路

  • 页面布局规划:界面主要划分为上下两个区域。a. 上部为绘图区域,本例采用Canvas控件实现;b. 下部为功能控制区,由一系列按钮组成。
  • 事件监听机制:通过为各个功能按钮绑定特定的事件处理函数,从而实现不同的绘图功能,例如绘制直线、矩形等。
  • 绘图区域交互:监听鼠标左键的按下(开始绘图)和抬起(停止绘图)事件,并根据当前选中的功能按钮,执行相应的图形绘制逻辑。

开发环境与核心控件解析

涉及知识点

开发环境:Python 3.7版本,PyCharm 2019集成开发环境。

Tkinter是Python的标准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实现画图软件功能内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表