Python案例2—12万字的Tkinter库绘制五角星(全版本)
大家好,我是白菜胡萝丸子
人生苦短,Python当歌
项目导入–绘制五角星V_1.0
版本V1.0 :用turtle库在Python中绘制五角星
项目分析—理清思路
1.分析问题:分析问题的计算部分
2.明确问题:划分问题的输入、处理和输出部分(IPO)
3.设计算法:计算部分的核心
-
引入图形绘制的turtle库(import turtle)
-
利用turtle库中的函数实现五角星的绘制
知识点学习–万丈高楼平地起
Turtle库与之前程序的区别
- 没有显示input( )和output( )
- 没有赋值语句
- 大部分语句为a.b( )的形式 表示使用a中的方法b() 调用函数库a中的函数b()
Turtle库绘图坐标体系
Turtle库形状绘制函数
- turtle.forword(distance) 画笔向前移动distance距离
- turtle.backword(distance) 画笔向后移动distance距离
- turtle.right(degree) 绘制方向向右旋转degree度
- turtle.exitonclick() 点击关闭图形窗口
上机编程–动动手,让程序运行起来
参照代码
"""作者:白菜胡萝丸子版本1.0:使用turtle库在python中绘制五角星"""import turtledef main(): turtle.speed(1) # 绘制五角星的第一条边 turtle.forward(100) turtle.right(144) # 绘制五角星的第二条边 turtle.forward(100) turtle.right(144) # 绘制五角星的第三条边 turtle.forward(100) turtle.right(144) # 绘制五角星的第四条边 turtle.forward(100) turtle.right(144) # 绘制五角星的第五条边 turtle.forward(100) turtle.right(144) turtle.exitonclick()if __name__ == "__main__": main()
执行结果
更上一层楼–让程序进化一点点
- 在V1.0版本绘制五角星的程序中你发现了什么问题?是不是又很多重复的代码,请尝试利用循环结构使代码更加简约
项目导入–绘制五角星V_2.0
版本2.0:观察V1.0版本的程序代码,是否能用while循环使版本1.0更加简洁
项目分析—理清思路
- 分析问题:分析问题的计算部分
- 明确问题:划分问题的输入、处理和输出部分(IPO)
- 设计算法:计算部分的核心
知识点学习–万丈高楼平地起
循环语句
- 控制程序的语句
- 判断程序确定一段程序是否再次执行一次或者多次
- 使用方法
while(<条件>):<语句块1><语句块2>
- 当条件为真(True)时,执行语句块1,当语句为假(Flase),退出循环
上机编程–动动手,让程序运行起来
参照代码
"""作者:白菜胡萝丸子版本2.0:观察V1.0版本的程序代码,是否能用while循环使版本1.0更加简介"""import turtledef main(): # 设置画笔绘制速度 turtle.speed(2) # 设置循环的判断条件 i = 0 # 绘制五角星的循环语句 while i < 5: turtle.forward(100) turtle.right(144) i = i + 1 # 设置点击关闭窗口 turtle.exitonclick()if __name__ == "__main__": main()
执行结果
更上一层楼–让程序进化一点点
循环语句使五角星的代码极大的简约,但如果希望程序更加模块化,比如将绘制五角星的程序封装到一个函数中,进而输入所绘制五角星的大小就可以使五角星的程序更加灵活了,那就让程序再进化一点点吧!
项目导入–绘制五角星V_3.0
版本3.0:将五角星的绘制封装到函数里,进而使程序更加模块化
项目分析—理清思路
- 分析问题:分析问题的计算部分
- 明确问题:划分问题的输入、处理和输出部分(IPO)
- 设计算法:计算部分的核心
知识点学习–万丈高楼平地起
函数定义
def ():
return
函数的调用过程
-
调用程序再调用函数处暂停执行
-
调用时将参数(实参)赋值给参数(形参)
-
执行函数体
-
返回执行结果,回到调用处继续执行
上机编程–动动手,让程序运行起来
参照代码
"""作者:白菜胡萝丸子版本3.0:将五角星的绘制封装到函数里,进而使程序更加模块化"""import turtledef pentagram(side_length): i = 0 while i < 5: turtle.forward(side_length) turtle.right(144) i = i + 1def main(): turtle.speed(10) side = 100 pentagram(side) turtle.exitonclick()if __name__ == "__main__": main()
执行结果
更上一层楼–让程序进化一点点
想多绘制一些重复的五角星,并且改变五角星边的颜色,给五角星填充颜色,该如何进行程序优化?
项目导入–绘制五角星V_4.0
版本4.0:绘制不同大小的重复五角星,设置五角星边的颜色和填充颜色
项目分析—理清思路
- 分析问题:分析问题的计算部分
- 明确问题:划分问题的输入、处理和输出部分(IPO)
- 设计算法:计算部分的核心
知识点学习–万丈高楼平地起
画笔控制函数
- turtle.penup()
抬起画笔,滞后移动画笔不会绘制图形 - turtle.pendown()
落下画笔,滞后移动,画笔绘制图形 - turtle.pensize()
设置画笔宽度 - turtle.pencolor()
设置画笔颜色 - turtle.pencolormode(255)
设置RGB色彩模式 turtle.color(255,255,255) - turtle.fillcolor(), turtle.begin_fill(), turtle.end_fill()
填充颜色
上机编程–动动手,让程序运行起来
参照代码
"""作者:白菜胡萝丸子版本V4.0:绘制不同大小的重复的五角星,设置五角星的颜色,填充颜色,画笔的粗细"""import turtle# 设置绘制五角星的函数def pentagram(side_length): i = 1 while i <= 5: turtle.forward(side_length) turtle.right(144) i = i + 1# 设置主函数def main(): # 设置初始五角星的边长和速度 size = 100 # 设置五角星绘制的速度 turtle.speed(2) # 设置绘制的颜色 turtle.colormode(255) turtle.pencolor((255 , 0 , 0)) # 设置绘制画笔的粗细 turtle.pensize(2) # 设置移动画笔的初始位置 turtle.penup() turtle.backward(100) turtle.pendown() # 设置填充的颜色 turtle.fillcolor('red') # 绘制重复五角星 while size <= 250: turtle.begin_fill() pentagram(size) turtle.end_fill() size = size + 50 # 点击关闭窗口 turtle.exitonclick()# 调用主函数if __name__ == '__main__': main()
执行结果
更上一层楼–让程序进化一点点
如果想要程序更加灵活,即实现用户决定重复绘制几次五角星以及五角星的大小,该如何改造代码?
项目导入–绘制五角星V_5.0
版本V5.0:实现用户决定重复绘制五角星的次数,五角星的大小,填充颜色等
项目分析—理清思路
- 分析问题:分析问题的计算部分
- 明确问题:划分问题的输入、处理和输出部分(IPO)
- 设计算法:计算部分的核心
知识点学习–万丈高楼平地起
知识点复习
- input函数
- while循环
- 函数的定义与调用
上机编程–动动手,让程序运行起来
参照代码
"""作者:白菜胡萝丸子版本V5.0:实现用户决定重复绘制五角星的次数,五角星的大小,填充颜色等"""import turtle# 设置绘制五角星的函数def pentagram(side_length): i = 1 while i <= 5: turtle.forward(side_length) turtle.right(144) i = i + 1# 设置主函数def main(): # 用户输入五角星的初始边长,重复次数,每重复一次增加的长度 side_length = float(input('您好,请您输入重复五角星的初始边长')) num = float(input('您好,请您输入准备重复绘制五角星的次数')) add_side_length = float(input('您好,请您输入每次重复绘制五角星增加的长度:')) side_color = input('您好,请您输入绘制五角星的边长颜色:') # 设置五角星的颜色 turtle.pencolor(side_color) # 设置循环控制变量 order = 1 while order <= num: pentagram(side_length) side_length = side_length + add_side_length order = order + 1 # 点击关闭窗口 turtle.exitonclick()# 调用主函数if __name__ == '__main__': main()
执行结果
更上一层楼–让程序进化一点点
是否将循环和函数整合到一个函数中(递归函数),递归函数是学习程序语言时要攀登的小山
项目导入–绘制五角星V_6.0
版本6.0:使用递归函数实现重复五角星的绘制
项目分析—理清思路
- 分析问题:分析问题的计算部分
- 明确问题:划分问题的输入、处理和输出部分(IPO)
- 设计算法:计算部分的核心
知识点学习–万丈高楼平地起
递归函数
函数定义中调用函数自身的方式称为递归
能够非常简洁地解决重要问题
每次函数调用时,函数参数会临时存储,相互没有影响达到终止条件时,各函数逐层结束运算,返回计算结果要注意终止条件的构建,否则递归无法正常返回结果
def digui (num)#定义递归函数print(num)#输出当前教字if num>0:#判断当前数字是否>0digui(nun-1)#调用函数本身else:print('----')print (num)#再次输出当前数字digui(3)
#运行过程digui (3)print (3)if 3>0: digui (2):#调用函数本身 print(2)if 2>0digui(1) #调用函数木身 print (1)if 1>0 digui (0):#调用函数本身 print (0)if 0>0: digui(num-1)#调用函数本身 else : print ('---') print (0)print(1) print (2) print (3)
递归优缺点
优点:
递归使代码看起来更加整洁、优雅
可以用递归将复杂任务分解成更简单的子问题使用递归比使用一些嵌套迭代更容易
缺点:
递归的逻辑很难调试、跟进
递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
上机编程–动动手,让程序运行起来
参照代码
"""作者:白菜胡萝丸子版本6.0:使用递归函数实现重复五角星的绘制"""import turtledef pentagram(side_length): i = 0 while i < 5: turtle.forward(side_length) turtle.right(144) i = i + 1 side_length = side_length + 100 if side_length <= 500: pentagram(side_length)def main(): turtle.speed(10) side = 100 pentagram(side) turtle.exitonclick()if __name__ == "__main__": main()
执行结果
更上一层楼–让程序进化一点点
除了turtle小海龟进行绘制图形外,Python还有没有其它其他方法或库进行图形绘制? Canvas控件
项目导入–绘制五角星V_7.0
版本7.0:使用tkinter库的canvas控件绘制五角星
项目分析—理清思路
- 分析问题:分析问题的计算部分
- 明确问题:划分问题的输入、处理和输出部分(IPO)
- 设计算法:计算部分的核心
引入tkinter
按照绘图步骤进行图形绘制
使用tkinter库中的Canvas控件进行绘图
注:Python提供了多个图形界面开发的库,tkinter是其中的一个,引入tkinter库以后可以快速的创建GUI ( Graphic User Interface)应用程序。
知识点学习–万丈高楼平地起
使用tkinter中的Canvas控件绘图步骤
1.引入tkinter G正在识别 import tkinter
2.建立主窗口,设置画布大小 top/root/windows = tkinter.tk() C = tkinter.Canvas(top/root/windows, bg=" blue" , height=“300" ,
width=“300" )
3.绘制各种图形,如线条、多边形、弧形、圆形等
4.消息主循环(root到pack相当于尺寸,样式,位置,然后绑定一个事件, mainloop相当于刷新或者启动这个事件) c.pack() top/root.mainloop()
Canvas语法格式w = canvas ( master , option=value,… )
绘图关键步骤解析
2.设置主窗口、画布大小背景色等属性
top = tkinter.tk()
top.title(“绘制五角星”) #设置窗口的title值
C = tkinter.Canvas(top, bg=" blue" , height= “300” , width = “300” )
绘图关键步骤解析
3.绘制各种图形,如线条、多边形、弧形、圆形等
create_ ,arc :绘制弧。
create_ rectangle0 :绘制矩形。
create. image :绘制图片。
create_ line() :绘制直线。
create_ polygon :绘制多边形。
create_ text :绘制文字。
create_ window :绘制组件。
canvas.creat_polygon(x0,yo,1,/…xn,yn,fill='color")
#左上点 center. x-(rmath.sin(2math.pi/5)), center. y-(rmath.cos(2math.pi/5)),
#右上点 center. x+ (rmath.sin(2math.pi/5)), center y-(rmath.cos<(2math.pi/5)),
#左下点 center. x-(rmath.sin(math.pi/5)), center_ y+(rmath.cos(math.pi/5)),
#顶点 center. _X, center. _y-r,
#右下点 center. x+ (rmath.sin(math.pi/5)), center. y+(rmath.cos(math.pi/5)), .
上机编程–动动手,让程序运行起来
参照代码
""""作者:白菜胡萝丸子版本7.0:使用tkinter库的canvas控件绘制五角星"""import tkinterimport mathtop = tkinter.Tk()top.title("绘制五角星")c = tkinter.Canvas(top, bg="pink", height="300", width="300")# 使用canvas控件绘制五角星r = 150center_x = 150center_y = 150polygon = c.create_polygon( # 左上点 center_x - (r*math.sin(2 * math.pi / 5)), center_y - (r*math.cos(2 * math.pi / 5)), # 右上点 center_x + (r*math.sin(2 * math.pi / 5)), center_y - (r*math.cos(2 * math.pi / 5)), # 左下点 center_x - (r*math.sin(math.pi / 5)), center_y + (r*math.cos(math.pi / 5)), # 顶点 center_x, center_y - r, # 右下点 center_x + (r*math.sin(math.pi / 5)), center_y + (r*math.cos(math.pi / 5)), fill="red")# 消息主循环c.pack()top.mainloop()
执行结果
更上一层楼–让程序进化一点点
目前已经掌握了使用turtle库和Canvas控件绘制五角星的方法,如果我们想绘制一面标准的五星红旗,该如何实现呢?
请见下一篇文章