内容正文:
第9章 图形绘制
Tkinter概述
画布绘图
图形的事件处理
图形绘制应用举例
9.1 Tkinter概述
Tkinter是Python语言的标准GUI库,常被用于快速开发小型图形界面应用程序。
9.1.2 使用Tkinter创建GUI程序的步骤
(1)导入Tkinter模块。
import tkinter(导入tkinter模块)
import tkinter as tk (导入tkinter模块为tk)
from tkinter import *(导入tkinter的所有内容)
(2)建立主窗口。
root = tkinter.Tk()
(5)绑定事件处理程序响应用户操作(如单击按钮)引发的 事件。
(6)进入事件循环,等待用户触发事件响应。
root.mainiloop()
(3)在主窗口中添加控件,如文本框、按钮等。
(4)调用控件的pack()、grid()、place()方法,通过几何布局管理器调整并显示其位置和大小。
9.1.3 Tkinter的主窗口
Tkinter的主窗口也被称为根窗体,是图形化应用程序的根容器,是Tkinter模块底层控件的实例。
在导入Tkinter模块后,我们可以调用Tk()方法来初始化一个根窗体实例。
window = Tk()
例 9-1 最简单的GUI程序示例。
(1) 在Python程序中导入Tkinter模块。
(2) 创建窗体对象。
(3) 启动消息循环。
from tkinter import *
frm_main = Tk()
frm_main.mainloop()
2. 装饰界面
属性 说明 举例
title(str) 窗口标题,str表示参数类型为字符串 title(‘数据分析’〕
iconbitmap(str) 窗口左上角程序图标 iconbitmap(".\\pic\\SUN.ICO")
geometry(‘宽x高距左右边距上下边’) 窗体的几何尺寸及在屏幕中的位置,其中x不能少,距左边用+右边用-,距上边用+下边用- geometry(‘800x500+100+50’)
resizable(b,b) 窗体尺寸的可变性,b表示逻辑型 resizable(0,0)(高宽都不可变)
9.1.4 画布对象的创建
画布(canvas)是用来绘制图形的区域,所有tkinter模块中的图形操作都是在画布上完成的。
(1)创建一个画布对象
画布对象名 = Canvas(窗口对象名, 属性名=属性值,...)
画布对象的常用属性:高度(height)、宽度(width)、背景色(bg或background)等。
c=Canvas(w,width=300,height=200,bg='white')
(2) 显示画布对象
c.pack()
(3) 可对画布的属性进行设置
c['bg']='green'
9.1.5 画布中的图形对象
各种图形对象的共性操作
1. 图形对象的标识:采用标识号和标签(tag)
标识号是在创建图形对象时自动为其赋予的唯一整数编号。
为图形对象指定标签的三种方法:
(1)在创建图形时,利用tags属性来指定标签。
(2)创建图形之后,可以利用画布的itemconfig()方法对tags属性进行设置。
(3)利用画布的addtag_withtag()方法来为图形对象添加新标签。
例如:
>>> id1=c.create_rectangle(10,10,100,50,tags="No1")
>>> id2=c.create_rectangle(20,30,200,100,tags=("myRect","No2"))
>>> c.itemconfig(id1,tags=("myRect","Rect1"))
>>> c.addtag_withtag("ourRect","Rect1")
注意:一个图形对象可以与多个标签相关联,同样一个标签可以与多个图形对象相关联。
2. 图形对象的共性操作
(1) gettags()方法:用于获取给定图形对象的所有标签。
(2) find_withtag()方法:用于获取与给定标签相关联的所有图形对象。
(3) delete()方法:用于从画布上删除指定的图形对象。
(4) move()方法:用于在画布上移动指定图形。
>>> print(c.gettags(id1)) ('myRect', 'Rect1', 'ourRect')
>>> print(c.find_withtag("Rect1"))
>>> c.delete(id1)
>>> c.move(id2,10,20)
9.2 画布绘图
9.2.1 绘制矩形
方法:create_rectangle()
格式:r=画布对象名.create_rectangle(x0,y0,x1,y1,属性设置……)
其中,(x0,y0)是矩形左上角的坐标,(x1,y1)是矩形右下角的坐标。属性设置即对矩形的属性进行设置。r保存图形的标识号。
>>>r=c.create_rectangle(80,70,250,180,tags="Rect2")
2.矩形对象的常用属性
(1) 矩形边框属性
outline属性:通过outline属性可以设置矩形的边框颜色,默认值为黑色。
width属性:通过width属性可以设置边框的宽度,默认值为1像素。
dash属性:通过dash属性可以绘制边框成虚线形式,该属性的值是整数元组。例如二元组(a,b),其中a表示要画多少个像素,b表示要跳过多少个像素。
(2) 矩形内部填充属性
fill属性:通过fill属性可以设置矩形内部区域的填充颜色,默认值为空字符串,即透明的效果。
stipple属性:在填充颜色时,可以使用stipple属性设置填充画刷,即填充的点刻效果,可以取gray12、gray25、gray50、gray75等值。
state属性:该属性用于设置图形的显示状态,默认值为NORMAL或normal,即正常显示。
9.2.2 绘制椭圆与圆弧
1.绘制椭圆
画布对象名.create_oval(x0,y0,x1,y1,属性设置……)
例 9-3 绘制如图所示的圆和椭圆
from tkinter import *
w=Tk()
w.title('绘制圆和椭圆')
c=Canvas(w,width=260,height=260,bg='white')
c.pack()
c.create_oval(30,30,230,230,fill='black',width=2)
c.create_oval(30,80,230,180,fill='green',width=2)
c.create_oval(80,30,180,230,fill='white',width=2)
13
2.绘制圆弧
canvas.create_arc(x0, y0, x1, y1, 属性设置...)
属性start:定义弧形的开始位置,其值为一个角度(x轴方向为0º)。默认值为0º。
属性extent:定义弧形的结束位置,其值表示从开始位置逆时针旋转的角度。默认值为90º。
属性style用于规定圆弧的样式,可以取三种值:
PIESLICE:扇形,即圆弧两端与圆心相连,默认值;
ARC:弧,即圆周上的一段;
CHORD:弓形,即弧加连接弧两端的弦。
14
from tkinter import *
w=Tk()
c=Canvas(w,width=350,height=200,bg="white")
c.pack()
c.create_arc(20,40,100,120,width=2) #默认样式是PIESLICE
c.create_arc(120,40,200,120,style=CHORD,width=2)
c.create_arc(220,40,300,120,style=ARC,width=2)
例子:
9.2.3 显示文本
画布对象名.create_text(x, y, 属性设置...)
(x,y)指定文本显示的参考位置
text属性:设置文本内容,其值即为要显示的字符串。
anchor属性:用于指定文本的哪个锚点与显示位置(x,y)对齐。锚点可通过E(东)、S(南)、W(西)、N(北)、CENTER(中)、SE(东南)、SW(西南)、NW(西北)、NE(东北)等方位常量表示
fill属性用于设置文本的颜色,默认值为黑色。
justify属性用于控制多行文本的对齐方式,其值可以是LEFT、CENTER或RIGHT,默认为LEFT。
font属性指定文本字体。
例 9-4 画布文本显示示例。
from tkinter import *
w=Tk()
w.title('文本显示')
c=Canvas(w,width=400,height=200,bg="white")
c.pack()
c.create_rectangle(200,100,201,101,width=8)
c.create_text(200,100,text="Hello Python1",\
font=("宋体",15,"normal"),anchor=SE)
c.create_text(200,100,text="Hello Python2",\
font=("宋体",15,"normal"),anchor=SW)
c.create_text(200,100,text="Hello Python3",\
font=("宋体",15,"normal"),anchor=NE)
c.create_text(200,100,text="Hello Python4",\
font=("宋体",15,"normal"),anchor=NW)
9.3 图形的事件处理
“事件”(event)指在程序执行过程中发生的操作。
例如单击鼠标左键、按下键盘上的某个键等。
某个对象可以与特定事件绑定在一起,这样当特定事件发生时,可以调用特定的函数来处理该事件。
1. 事件绑定
使用画布对象的bind()方法或者tag_bind()方法。
例如:
c.bind("<Button-1>",canvasF)
将画布对象与鼠标左键单击事件<Button-1>进行了绑定。
c.tag_bind(t,"<Enter>",textF1)
将画布上的文本对象t与鼠标指针进入事件<Enter>进行了绑定。
2.事件处理函数
对象与特定事件进行绑定时,需告诉系统当对象发生了指定的事件后该如何处理的函数。
例如:
canvasF()函数用于处理画布上的鼠标左键单击事件。
功能是改变文本t的内容,如果当前内容是"Python!"就变成"Programming!",如果当前是"Programming!"就变成"Python!"。
3.主窗口事件循环
语句:w.mainloop()
作用:进入主窗口的事件循环。系统会自动监控在主窗口上发生的各种事件,并触发相应的处理函数。
turtle(海龟)库是turtle绘图体系的Python实现
turtle绘图体系:1969年诞生,主要用于程序设计入门
Python语言的标准库之一
入门级的图形绘制函数库
9.4 turtle绘图
turtle的原理
turtle(海龟)是一种真实的存在
有一只海龟,其实在窗体正中心,在画布上游走
走过的轨迹形成了绘制的图形
海龟由程序控制,可以变换颜色、改变宽度等
turtle.setup()函数
格式:turtle.setup(width,height,startx,starty)
作用:设置主窗体的大小和位置。
width:窗口宽度
height:窗口高度
startx:窗口左侧与屏幕左侧的像素距离
starty:窗口顶部与屏幕顶部的像素距离
>>>turtle.setup(650, 350,200,200)
turtle的魅力
#PythonDraw.py
import turtle
turtle.setup(650, 350, 200, 200) turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25) turtle.pencolor("purple") turtle.seth(-40)
for i in range(4):
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
turtle.done()
1.导入turtle模块
使用turtle绘图,首先需要导入turtle模块,有以下两种方法。
>>> import turtle
>>> from turtle import *
import turtle
函数调用时使用的语句格式是turtle.circle(10)
from turtle import *
函数调用时使用的语句格式是 circle(10)
import turtle as t
函数调用时使用的语句格式是 t.circle(10)
01
02
03
2.turtle绘图属性
turtle绘图有三个要素,分别是位置、方向和画笔。
(1)位置是指箭头在Turtle 图形窗口中的位置。
(2)方向是指箭头的指向,使用left(degree)、right(degree)函数使得箭头分别向左、向右旋转degree度。
(3)画笔是指绘制的线条的颜色和宽度。
9.4.2 画笔控制函数
1. turtle.penup()
作用:抬起画笔,之后移动画笔不绘制形状。
2. turtle.pendown()函数
作用:落下画笔,之后移动画笔将绘制形状。
3. turtle.pensize(width)函数
作用:设置画笔宽度,当无参数输入时返回当前画笔宽度。
turtle.pensize(25)
4. turtle.pencolor(colorstring)函数或turtle.pencolor((r,g,b))
作用:设置画笔颜色,当无参数输入时返回当前画笔颜色。
6. turtle. color(color1,color2)函数
作用:同时设置pencolor=color1,fillcolor=color1
5. turtle. fillcolor(colorstring)函数
作用:设置绘制图形的填充颜色
7. turtle. begin_fill( )函数
8. turtle. end_fill( )函数
作用:准备开始填充图形
作用:填充完成
9.4.3 形状绘制函数
1. turtle.fd(distance)函数或turtle.forward(distance)
作用:向小海龟当前行进方向前进 distance 距离;distance为负数时表示向相反方向前进。
>>>turtle.fd(40)
2. backward(d):与forward()函数相反,控制箭头向后移动,其中d代表移动的距离。
forward(d)
backward(d)
3. goto(x,y):将箭头从当前位置径直移动到坐标为(x,y)的位置,移动后方向也不改变。如果想要移动箭头到(x,y)处理,但不要绘制图形,可以使用up()函数。
例如,下列命令绘制一根水平直线。
from turtle import *
reset() #将整个绘图窗口清空并将箭头置于原点(窗口的中心)
goto(100,0) #当前位置(0,0)运动到(100,0)位置
import turtle
turtle.goto( 100, 100)
turtle.goto( 100,-100) turtle.goto(-100,-100) turtle.goto(-100, 100) turtle.goto(0,0)
绝对角度
4. turtle.seth(to_angle)函数或turtle.setheading(to_angle)
作用:设置小海龟当前行进方向为 to_angle,该角度是绝对方向角度值。只改变方向但不行进。
>>> turtle.seth(-40)
turtle角度坐标体系
turtle.seth(45) turtle.seth(-135)
5. turtle.left(angle)函数
作用:顺时针移动angle度。该角度为相对角度。只改变方向不移动。
6. turtle.right(angle)函数
作用:逆时针移动angle度。该角度为相对角度。只改变方向不移动。
Turtle角度坐标体系
import turtle
turtle.left(45)
turtle.fd(150)
turtle.right(135)
turtle.fd(300)
turtle.left(135)
turtle.fd(150)
7. turtle.circle(radius,extent=None)函数
作用:根据半径 radius 绘制 extent 角度的弧形。
radius:弧形半径,当值为正数时,半径在小海龟左侧, 当值为负数时,半径在小海龟右侧。
extent:绘制弧形的角度,当不设置参数或参数设置为 None 时,绘制整个圆形。
turtle.circle(100)
turtle.circle(-100,90)
例12-2 绘制三个同心圆。
程序如下:
from turtle import *
for i in range(3):
up() #提起画笔
goto(0,-50-i*50) #确定画圆的起点
down() #放下画笔
circle(50+i*50) #画圆
1、下列哪个选项能够使用turtle库绘制一个半圆形?( )
A.turtle.fd(100)
B.turtle.circle(100)
C.turtle.circle(100, 90)
D.turtle.circle(-100, 180)
2.turtle库中控制颜色的函数是( )。
A.pensize ()
B.pendown()
C.goto()
D.pencolor()
D
D
3、 下列程序运行后,得到的图形是( )。
from turtle import *
goto(100,100)
A.水平直线 B.垂直直线
C.斜线 D.只移动坐标不做图
4、 turtle库中控制顺时针转的函数是( )。
A.pendown()
B.left()
C.right()
D.pencolor()
C
C
例12-1 绘制一个正方形。
程序如下:
from turtle import *
color("blue") #定义绘制时画笔的颜色
pensize(5) #定义绘制时画笔的线条宽度
speed(10) #定义绘图的速度
for i in range(4): #绘出正方形的四条边
forward(100)
right(90)
使用turtle库,绘制一个正方形。请完成以下程序。
import turtle as t
t.pensize(3)
for i in range(4):
t.fd(100)
_______
t.left(90)
使用turtle库,绘制一个叠边形,其中,叠边形内角为100度。请完成以下程序。
import turtle as t
t.pensize(2)
for i in range(9):
t.fd(180)
_______
t.right(80)
使用turtle库,绘制一个六边形。请完成以下程序。
import turtle as t
t.pensize(3)
for ______ _ _:
t.fd(100)
t.left(60)
i in range(6)
使用turtle库,绘制一个边长为40像素的十二边形。请完成以下程序。
import turtle
turtle.pensize(2)
d = 0
for ______ :
turtle.fd(40)
d += 30
turtle.seth(d)
i in range(12)
例 使用turtle库,绘制一个六瓣花。
程序如下:
from turtle import *
x = 50
for i in range(6):
circle(x,240)
left(60)
例12-5 使用turtle库绘制红色五角形。
程序如下:
from turtle import *
pencolor("red")
goto(-100, 50)
pendown()
color("red")
begin_fill()
for i in range(5):
forward(200)
right(144)
end_fill()
hideturtle()
done()
例 绘制太阳花,其中画笔颜色为红色,填充颜色为黄色。
程序如下:
import turtle
turtle.color("red","yellow")
turtle.begin_fill()
for i in range(50):
turtle.forward(200)
turtle.right(170)
turtle.end_fill()
turtle.done()
9.5 图形绘制应用举例
实例一:Python蟒蛇绘制
import turtle
turtle.setup(650, 350, 200, 200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
实例二:科赫曲线绘制
import turtle
def koch(size, n):
if n==0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(600,600)
turtle.speed(0)
turtle.penup()
turtle.goto(-200,-100)
turtle.pendown()
turtle.pensize(2)
level = 5
koch(400,level)
turtle.right(120)
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.hideturtle()
main()
turtle.done()
$$