Tkinter Canvas 绘制线条
tkinter模块内的Canvas,这个模块可以绘图,也可以制作动画。
可以使用Canvas( )方法建立画布对象。
tk = Tk() # 使用tk当窗口Tk对象
canvas = Canvas(tk, width=xx, height=yy) # xx, yy 是画布宽和高
canvas.pack() # 可以将画布pack好,这是必要的
画布建立完成后,左上角是坐标(0,0),向右x轴递增,向下y轴递增。
绘制线条create_line()的使用方式如下。
create_line(x1, y1, x2, y2, ... xn, yn, options)
线条将会沿着(x1,y1),(x2,y2), …绘制下去,下列是常用的options用法。
(1)arrow
:默认是没有箭头,使用arrow=tk.FIRST在起始线末端有箭头,arrow=LAST在最后一条线末端有箭头,使用arrow=tk.BOTH在两端有箭头。
(2)arrowshape
:使用元组(d1, d2, d3)代表箭头,默认是(8,10,3)。
(3)capstyle
:这是线条终点的样式,默认是BUTT,也可以选择PROJECTING、ROUND。
(4)dash
:建立虚线,使用元组储存数字数据,第一个数字是实线,第二个数字是空白,如此循环当所有元组数字用完又重新开始。例如,dash=(5,3)产生5像素实线,3像素空白,如此循环。再如,dash=(8,1,1,1)产生8像素实线和点的线条,dash=(5,)产生5像素实线5像素空白。
(5)dashoffset
:与dash一样产生虚线,但是一开始数字是空白的宽度。
(6)fill
:设置线条颜色。
(7)joinstyle
:线条相交的设置,默认是ROUND,也可以选择BEVEL、MITER。
(8)stipple
:绘制位图(Bitmap)线条。
(9)width
:线条宽度。
示例1
在半径为100的圆外围建立12个点,然后将这些点彼此连接。
from tkinter import *
import math
tk = Tk()
canvas = Canvas(tk, width=640, height=480)
canvas.pack()
x_center, y_center, r = 320, 240, 100
x, y = [], []
for i in range(12): # 建立圆外围12个点
x.append(x_center + r * math.cos(30*i*math.pi/180)) # x = x0 + r * cos(A)
y.append(y_center + r * math.sin(30*i*math.pi/180)) # y = y0 + r * sin(A)
for i in range(12): # 将12个点彼此连线
for j in range(12):
canvas.create_line(x[i],y[i],x[j],y[j])
tk.mainloop()
输出:
上述程序使用了数学函数sin( )和cos( )以及pi,这些是在math模块。使用create_line( )时,在options参数字段可以用fill设置线条颜色,用width设置线条宽度。
示例2
不同线条颜色与宽度。
from tkinter import *
import math
tk = Tk()
tk.title("apidemos.com")
canvas = Canvas(tk, width=640, height=480)
canvas.pack()
canvas.create_line(100,100,500,100)
canvas.create_line(100,125,500,125,width=5)
canvas.create_line(100,150,500,150,width=10,fill='blue')
canvas.create_line(100,175,500,175,dash=(10,2,2,2))
tk.mainloop()
输出:
示例3
由线条交接了解joinstyle参数的应用。
from tkinter import *
import math
tk = Tk()
tk.title("apidemos.com")
canvas = Canvas(tk, width=640, height=480)
canvas.pack()
canvas.create_line(30,30,500,30,265,100,30,30,
width=20,joinstyle=ROUND)
canvas.create_line(30,130,500,130,265,200,30,130,
width=20,joinstyle=BEVEL)
canvas.create_line(30,230,500,230,265,300,30,230,
width=20,joinstyle=MITER)
tk.mainloop()
输出:
示例4
由线条了解capstyle参数的应用。
from tkinter import *
import math
tk = Tk()
tk.title("apidemos.com")
canvas = Canvas(tk, width=640, height=480)
canvas.pack()
canvas.create_line(30,30,500,30,width=10,capstyle=BUTT)
canvas.create_line(30,130,500,130,width=10,capstyle=ROUND)
canvas.create_line(30,230,500,230,width=10,capstyle=PROJECTING)
# 以下是垂直线
canvas.create_line(40,20,40,240)
canvas.create_line(500,20,500,250)
tk.mainloop()
输出:
示例5
建立位图线条。
from tkinter import *
import math
tk = Tk()
tk.title("apidemos.com")
canvas = Canvas(tk, width=640, height=480)
canvas.pack()
canvas.create_line(30,30,500,30,width=50,stipple="gray25")
canvas.create_line(30,130,500,130,width=50,stipple="questhead")
canvas.create_line(30,230,500,230,width=50,stipple="info")
tk.mainloop()
输出: