用PythonTkinter模块做简易画图板
2022-06-01
一、功能需求分析
在开始写代码之前,先分析程序需要实现的功能。一个简易的画图板应该有取色器、画笔工具、直线工具、矩形工具、圆形工具、一键清除这六项基本功能。做这个程序只需用到Canvas和Button两种控件。Python 提供了多个图形开发界面的库,Tkinter、wxPython、Jython都是常用Python GUI 库。Tkinter是一个轻量级的跨平台图形用户界面(GUI)开发工具,是Python自带的官方标准库,安装Python 之后直接导入就可以使用, 我们常见的Python IDLE就是使用Tkinter实现的。需要用到的函数及函数用法如下表:
二、 界面设计
这里使用了网格布局方式的grid布局管理器,简便易用。首先,用import导入Tkinter模块及colorchooser函数。
然后设置窗口标题及背景颜色并创建六个功能按钮,并设置row(行)值为0,column(列)值依次增加以将六个按钮放在第0行的不同列上。接着在第1行创建一个Canvas画布控件。并且将columnspan值设为6以对0~5列进行合并。这样Canvas组件就占了6列,有了足够的宽度。
代码如图1。
运行效果如图2。
三、 功能实现
1.实现按钮响应
接下来我们开始给这些按钮编写功能。首先写出六个按钮的事件响应函数,并进行绑定。
这里我们声明了两个全局变量:一个是Shape,用于储存当前工具所绘制的形状;另一个是color,用于储存当前颜色的十六进制颜色值。
在取色器事件响应函数中,我们使用了askcolor函数。在使用askcolor函数时,用户选取颜色点击确定后的返回值是一个元组,元组中下标为0的元素是一个元组(R,G,B),表示用户选取颜色的RGB值,下标为1的元素是所选颜色的十六进制值。
在画笔、矩形、直线、圆形工具的事件响应函数中,我们只需要将全局变量Shape设置成代表形状的相应字符串就行了(注:p代表画笔,l代表直线,r代表矩形,c代表圆形)。
在一键清除事件响应函数中,我们用Canvas的delete(ALL)函数删除画布的所有内容。
写完函数之后,我们把这几个按钮的事件响应函数和左键单击按钮的事件2.画布功能实现
然后我们在Canvas上写绘制图形的核心代码。经过分析,我们在画板上画图时一般分为三个階段——落笔(按下鼠标左键)、绘制(按住鼠标左键并移动)、抬笔(松开鼠标左键)。
而我们在处理矩形、圆形、直线操作时,只需要在落笔时记录起始点的坐标prevX及抬笔时终止点的坐标prevY,再用画布的函数绘制相应图形就行了。因此我们就把这三个工具负责绘制相关功能的函数都合在了落笔函数pen_down和抬笔函数pen_up里面,代码如图4。
但是画笔工具就没这么容易了,画笔工具需要实时绘制,即鼠标到哪儿笔迹就到哪儿。所以我们需要(在使用画笔工具时)按下鼠标就不断地绘制点,这样就可以做到实时绘制了。
不过问题又来了,Canvas中并没有绘制点的坐标。所以我们需要用绘制直线的函数create_line并将起始点坐标和终止点坐标都设为当前鼠标的坐标,这样就可以在鼠标走过的地方留下小点了,点动成线就有了笔迹。最后把画笔绘制的函数draw和按下鼠标左键不放并拖动的事件
还需要注意的是,在draw函数里,务必要判断当前的工具是不是画笔,不然在使用其他工具时也会在鼠标后面出现一条笔迹。
四、运行测试
至此,画图板所有的代码都完成了,接下来运行测试,修改Bug。简易画图板就实现了(图5)!
9885F23B-6D7E-47AB-B894-04C86496F1B7