1. 简介
Python是一种高级语言,它无处不在。Python有一个强大的图像处理库Pillow。本篇文章将带领读者通过一个简单的例子学习如何利用Python的Pillow库,在Python中实现一个画板。
2. 导入所需模块
在Python中,我们需要导入所需的模块。
2.1 导入PIL模块
PIL模块是Python中的一个图像处理库。首先,我们来安装Pillow库。
!pip install pillow
安装成功后,我们通过以下代码导入PIL模块:
from PIL import Image, ImageDraw, ImageFont
其中,Image模块用于创建新的空白图像或打开图像文件,ImageDraw模块用于画图,ImageFont模块用于处理字体。
2.2 导入Tkinter模块
Tkinter是Python中的一个图形用户界面(GUI)开发库。
import tkinter as tk
我们还需要为我们的画板设置一些简单的控件,如画笔大小和颜色,我们将在接下来的步骤中创建它们。Tkinter模块将帮助我们在画板上创建这些控件。
3. 创建画板
我们要开始创建我们的画板了。下面是创建画板的基本步骤:
使用Tk::创建顶层窗口(root)
在顶层窗口上创建画布(canvas)
定义画布的大小和颜色
将画布放置在顶层窗口中
3.1 创建顶层窗口
我们需要使用Tkinter模块的Tk()方法创建一个名为root的顶层窗口。
root = tk.Tk()
3.2 创建画布
使用Tkinter模块的Canvas()方法创建一个名为canvas的画布。在这里我们可以设置画布的大小和颜色。
canvas = tk.Canvas(root, width=640, height=480, bg='white')
3.3 将画布放置在顶层窗口中
使用Tkinter模块的pack()方法将画布放置在顶层窗口中。
canvas.pack()
4. 设置画板的控件
现在,我们将在画板中添加一些控件,如画笔大小和颜色。
4.1 画笔颜色
我们将使用一个列表来存储我们想要的颜色,用户可以从中选择:
colors = [('black', 'black'), ('red', 'red'), ('blue', 'blue'), ('green', 'green'), ('purple', 'purple'), ('orange', 'orange')]
这将为我们提供用于画笔颜色的颜色。
4.2 画笔大小
sizes = [('Thin', 4), ('Medium', 8), ('Thick', 12), ('Huge', 16)]
这将为我们提供绘制线条时用于画笔大小的选项。
4.3 创建控件
现在我们将在画板的左侧创建两个控件,一个是用于选择画笔颜色,另一个是用于选择画笔大小。
# 创建画笔颜色控件
color_frame = tk.Frame(root)
color_frame.pack(side=tk.LEFT, pady=5)
tk.Label(color_frame, text='Color: ').pack(side=tk.LEFT)
for color, cn_name in colors:
select_color_button = tk.Radiobutton(color_frame, bg=color, variable=color_var, value=color, indicatoron=False, width=10, height=1)
select_color_button.pack(side=tk.LEFT)
# 创建画笔大小控件
size_frame = tk.Frame(root)
size_frame.pack(side=tk.LEFT, padx=5, pady=5)
tk.Label(size_frame, text='Size: ').pack(side=tk.LEFT)
for size, value in sizes:
select_size_button = tk.Radiobutton(size_frame, text=size, variable=size_var, value=value, indicatoron=False, width=10, height=1)
select_size_button.pack(side=tk.LEFT)
上例中,我们使用了Tkinter模块的Frame()方法创建了color_frame和size_frame两个框架,并使用pack()方法将所创建的框架放置到画板的左侧。
对于每个按钮,我们使用Radiobutton()方法创建了select_color_button和select_size_button,并将它们放置在color_frame和size_frame中。
5. 实现绘图功能
现在我们将实现绘图功能。下面是我们实现画板的基本步骤:
使用PIL模块创建一个空白图像
使用ImageDraw模块创建一个空白画布,然后将其添加到图像上
定义一个函数,用于在画板上绘图
5.1 创建图像对象
image = Image.new('RGB', (640, 480), (255, 255, 255))
5.2 创建画布对象并添加到图像上
draw = ImageDraw.Draw(image)
5.3 定义绘图函数
def paint(event):
# 记录画笔颜色和笔刷大小
color = color_var.get()
size = size_var.get()
# 绘制直线
x1, y1 = (event.x - size), (event.y - size)
x2, y2 = (event.x + size), (event.y + size)
canvas.create_oval(x1, y1, x2, y2, fill=color, outline=color)
# 绘制图像
draw.line([x1, y1, x2, y2], fill=color, width=size * 2)
在绘图函数paint()中,我们首先记录了所选画笔颜色和笔刷大小。然后,我们使用绘图坐标来在画板上绘制一条新线,并将其添加到我们的Pillow图像对象上。
5.4 绑定画板和绘画函数
现在,我们需要将画板与绘图函数绑定。
canvas.bind('', paint)
这将使画板在鼠标动作时实时绘制图形
6. 运行程序
现在我们只需要在程序末尾添加下面的代码就可以运行程序了:
root.mainloop()
完整代码:
from PIL import Image, ImageDraw, ImageFont
import tkinter as tk
# 创建顶层窗口
root = tk.Tk()
# 创建画布
canvas = tk.Canvas(root, width=640, height=480, bg='white')
# 设置画笔颜色
color_var = tk.StringVar()
colors = [('black', 'black'), ('red', 'red'), ('blue', 'blue'), ('green', 'green'), ('purple', 'purple'), ('orange', 'orange')]
# 设置画笔大小
size_var = tk.IntVar()
sizes = [('Thin', 4), ('Medium', 8), ('Thick', 12), ('Huge', 16)]
# 创建画笔颜色控件
color_frame = tk.Frame(root)
color_frame.pack(side=tk.LEFT, pady=5)
tk.Label(color_frame, text='Color: ').pack(side=tk.LEFT)
for color, cn_name in colors:
select_color_button = tk.Radiobutton(color_frame, bg=color, variable=color_var, value=color, indicatoron=False, width=10, height=1)
select_color_button.pack(side=tk.LEFT)
# 创建画笔大小控件
size_frame = tk.Frame(root)
size_frame.pack(side=tk.LEFT, padx=5, pady=5)
tk.Label(size_frame, text='Size: ').pack(side=tk.LEFT)
for size, value in sizes:
select_size_button = tk.Radiobutton(size_frame, text=size, variable=size_var, value=value, indicatoron=False, width=10, height=1)
select_size_button.pack(side=tk.LEFT)
# 创建图像对象
image = Image.new('RGB', (640, 480), (255, 255, 255))
draw = ImageDraw.Draw(image)
# 定义绘图函数
def paint(event):
# 记录画笔颜色和笔刷大小
color = color_var.get()
size = size_var.get()
# 绘制直线
x1, y1 = (event.x - size), (event.y - size)
x2, y2 = (event.x + size), (event.y + size)
canvas.create_oval(x1, y1, x2, y2, fill=color, outline=color)
# 绘制图像
draw.line([x1, y1, x2, y2], fill=color, width=size * 2)
# 绑定画板和绘画函数
canvas.bind('', paint)
# 将画布放置在顶层窗口中
canvas.pack()
# 运行程序
root.mainloop()
7. 总结
本文中,我们学习了如何使用Python的Pillow库和Tkinter模块构建一个简单的画板。我们了解了如何创建控件,并使用绑定函数将这些控件和画板相连,实现在线绘图。