创作背景
- 本菜鸡最近有个需求,就是用
tkinter
绘图 - 一说 python 绘图,大家肯定都会想到
turtle
这个库,谁入门 python 都会先学到 turtle,然后自己 DIY 一下,绘制好多好看的图形 - 但肯定也有很多人想过要在自己软件的 可视化界面 中绘图
- 本菜鸡今天就来一步一步的教大家如何实现
思路讲解
-
首先,创建画布 。As we all know,绘图,一定要有
画布
,不管是在现实生活中还是在计算机中,有了画布
,我们的图才有地方显示- (总不能对着空气随手一画就显示出来吧?那是未来,不是现在)
- 所以我们的第一步就是要创建一个画布
- 创建画布的方法就是利用
tkinter.Canvas
来给我们的软件创建一个画布,我们后续的绘图就都在这个画布上进行了 - 代码如下
-
import tkinter as tk # 创建一个窗口,作为我们程序的主窗口 win = tk.Tk() # 创建画布 canvas = tk.Canvas(win) canvas.pack() # 程序陷入循环,等待操作 win.mainloop()
- 要点:
- 记得将 canvas 打包,否则窗口中是不会显示出来画布的
- 记得加上
win.mainloop()
,否则窗口一闪而过,你就没机会了 - (你看看给我点赞和收藏我还有机会吗?😢)
-
然后,我们就要 构造绘图函数 了。
- 你问我为什么要构造绘图函数?
- 那肯定是因为有较高的
可移植性
可移植性
在这里是指,当我们要绘制不同的图形时,其他的包括主体框架
、函数调用
之类的都不需要变化,只需要改变绘图函数,即可让我们的软件绘制出不同的图形- 在这里我以
五环图
为例,我们先使用 turtle 默认的窗口进行绘图,直到我们的绘图部分的代码没有问题了在进行下一步。 - 代码如下
-
import turtle def draw_Olympic_Rings(): # 设置画笔粗细 turtle.width(10) # 设置蓝色 turtle.color('blue') # 移动到相应位置 turtle.penup() turtle.goto(-90, 0) turtle.pendown() # 绘图 turtle.circle(40) # 以下同上 turtle.color('black') turtle.penup() turtle.goto(0, 0) turtle.pendown() turtle.circle(40) turtle.color('red') turtle.penup() turtle.goto(90, 0) turtle.pendown() turtle.circle(40) turtle.color('orange') turtle.penup() turtle.goto(-45, -40) turtle.pendown() turtle.circle(40) turtle.color('green') turtle.penup() turtle.goto(45, -40) turtle.pendown() turtle.circle(40) turtle.done() draw_Olympic_Rings()
- 绘图效果如下图所示
- 看起来也确实还不错的亚子
-
最后,万事俱备,只欠 组合 了。
- 我们看一下 turtle 的官方文档
- 我们可以看到,如果要在我们的绘图软件中绘图,需要
创建画布作为 turtle 的运动场
,并且,还需要用上一步返回的对象指定 turtle 在哪里绘图
- 一步一步来
- 先创建一个画布,作为 turtle 的运动场,代码如下(在第一步的基础上),放入第二步的函数中
- 然后把 TurtleScreen 对象设置为 turtle 的运动场
- 代码如下
-
def draw_Olympic_Rings(): # 创建一个画布并显示 canvas = tk.Canvas(win) canvas.pack() # 用画布创建一个 TurteScreen 对象 screen = turtle.TurtleScreen(canvas) # 将 TurtleScreen 对象作为 turtle 的运动场 raw = turtle.RawTurtle(screen) # 这里是绘图的主要部分 # 让 screen 对象陷入循环 screen.mainloop()
- 此时,我们就将我们自己创建的软件窗口作为 turtle 绘图的画布了
- 绘图函数就需要修改一下,将绘图函数中所有的
turtle
用raw
(创建的 screen 对象)代替,例如,将turtle.width(10)
修改为raw.width(10)
- 我们可以设置一个按钮,点击按钮后进行绘图
- 我们看一下 turtle 的官方文档
成果展示
- 总代码
# -*- coding=utf-8 -*-
# @Time : 2021/6/17 23:57
# @Author : lhys
# @FileName: Olympic_rings.py
import tkinter as tk
import turtle
def draw_Olympic_Rings():
canvas = tk.Canvas(win)
canvas.pack()
screen = turtle.TurtleScreen(canvas)
raw = turtle.RawTurtle(screen)
raw.width(10)
raw.color('blue')
raw.penup()
raw.goto(-90, 0)
raw.pendown()
raw.circle(40)
raw.color('black')
raw.penup()
raw.goto(0, 0)
raw.pendown()
raw.circle(40)
raw.color('red')
raw.penup()
raw.goto(90, 0)
raw.pendown()
raw.circle(40)
raw.color('orange')
raw.penup()
raw.goto(-45, -40)
raw.pendown()
raw.circle(40)
raw.color('green')
raw.penup()
raw.goto(45, -40)
raw.pendown()
raw.circle(40)
screen.mainloop()
if __name__ == '__main__':
win = tk.Tk()
tk.Button(
win,
text='画五环图',
command=lambda :draw_Olympic_Rings()
).pack()
win.mainloop()
- 效果图如下
- 成功完成需求!!!
写在后面
- 这只是一个非常简陋的绘图软件,但我们要实现的主要功能都实现了
- 大家可以根据自己的需要,美化一下主界面
结尾
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。