#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : cp9_1_1.py
# @Author: WRH
# @Date : 2021/5/24
# @Edition:Python3.8.6
# 第9章:图形绘制与数据可视化
# 9.1 tkinter库的Canvas图形绘制方法
# Canvas画布实例的主要属性
'''
属性 含义
bg 背景色
bd 前景色
bitmap 黑白二值图标
image 显示图像
bd 边框宽(默认2像素)
width 宽度(像素)
height 高度(像素)
'''
# Canvas画布实例的主要绘图方法
'''
方 法 功 能 主要参数
create_arc() 绘弧形和扇形 常用参数除两点位置外,还有start(初始角度)和extent(中止角度),
参数fill为填充色,outline为轮廓线色
create_image() 绘图像 用参数file指向图像文件,支持GIF(无动画)、PNG等格式,不支持JPG格式
create_line() 绘直线 两点坐标。参数arrow为箭头样式,默认为无,使用tkinter.FIRST或tkinter.LAST
分别表示箭头在首或尾。参数dash为表示虚线样式的元组型参数,如dash=(4, 2)
表示连续4像素间隔2像素
create_oval() 绘椭圆 用左上角和右下角两点的位置定位出矩形内切椭圆
create_polygon() 绘多边形 顶角点位置的X和y值作为参数
create_rectangle() 绘矩形 用左上角和右下角两点的位置定位出矩形
create_text() 文本标签 显示位置和text (文本内容)
delete() 删除指定图形 参数为指定图形对象的名称,全部删除为tkinter.ALL
'''
# 9.1.1 Canvas绘图的基本方法
# 1.创建画布和颜色填充
# Canvas画布的坐标原点在左上角,默认单位是像素,x轴向右为正,y轴向下为正
# 例9-1 在320×240的窗体上创建高200,宽280的画布,并填充红色。
import tkinter
root = tkinter.Tk()
root.geometry('320x240')
mycanvas = tkinter.Canvas(root, bg='red', height=200, width=280) # 添加画布控件并设置其属性
mycanvas.pack()
btn1 = tkinter.Button(root, text='关闭', command=root.destroy) # 添加按钮控件并设置其属性
btn1.pack()
root.mainloop()
# 2.绘制图形
# 例9-2
'''
在320×240的窗体上创建高200像素,宽300像素的画布,鼠标单击画布,
依次绘出:从(90,10)到(200,200)点的矩形;
从(90,10)到(200,200)点的内切椭圆并填充绿色;
从(90,10)到(200,200)点的内切扇形并填充粉红色;
连接(20,180)、(150,10)和(290,180)三点形成蓝色框线且无色填充的三角形;
从(10,105)到(290,105)点的红色直线;
以(50,10)为起点用RGB"#123456"颜色绘制文本标签“我的画布”。单击“清空”按钮删除所有图形
'''
import tkinter
# 实例化根窗体
root = tkinter.Tk()
root.geometry('320x240')
# 实例化Canvas画布
mycanvas=tkinter.Canvas(root, width=300, height=200)
mycanvas.pack()
# 定义函数,绘制图形
def draw(event):
# 画矩形
mycanvas.create_rectangle(90, 10, 200, 200)
# 画椭圆,填充绿色
mycanvas.create_oval(90, 10, 200, 200, fill='green')
# 画扇形
mycanvas.create_arc(90, 10, 200, 200, fill='pink')
# 画多边形(三角形),前景色为蓝色,无填充色
mycanvas.create_polygon(20, 180, 150, 10, 290, 180, outline='blue', fill='')
# 画直线
mycanvas.create_line(10, 105, 290, 105, fill='red')
# 写文字,颜色为十六进制RGB字符串
mycanvas.create_text(50, 10, text='我的画布', fill='#123456')
# 画布绑定鼠标单击事件,鼠标左键单击动作完成,绘制的图像才会显示
mycanvas.bind('<ButtonPress-1>', draw)
# 定义函数,删除画布上的所有图形
def delt():
mycanvas.delete(tkinter.ALL)
# 实例化按钮控件,并设置其命令属性为除所有图形
btnclear = tkinter.Button(root, text='清空', command=delt)
btnclear.pack()
root.mainloop()
# 3.呈现位图图像
# Canvas画布支持呈现位图图像文件,文件类型包括GIF(无动画)、PNG等格式,但不支持JPG格式。
# 例9-3 在320×240的窗体上创建画布,并呈现C:\1.gif图像
import tkinter
root = tkinter.Tk()
root.geometry('320x240')
mycanvas = tkinter.Canvas(root)
mycanvas.pack()
photo = tkinter.PhotoImage(file='1.gif')
mycanvas.create_image(100, 100, image=photo)
root.mainloop()
# 4.利用鼠标事件绘图
# 利用按住鼠标左键移动的鼠标事件,不断读取鼠标当前位置,每次扩张1个像素绘制椭圆点,即可在画布上留下鼠标轨迹。
# 例9-4 在320×240的窗体上创建画布,并以蓝色笔创建鼠标画板。
import tkinter
root = tkinter.Tk()
w = tkinter.Canvas(root, width=320, height=240)
w.pack()
def move(event):
x = event.x
y = event.y
w.create_oval(x, y, x+1, y+1, fill='blue') # 绘制椭圆,四个参数指定一个限定矩形(Tkinter 会自动在这个矩形内绘制一个椭圆)
w.bind('<B1-Motion>', move) # <B1-Motion> 按住鼠标左健移动, 通过响应“鼠标左键按住拖动”事件(<B1-Motion>),
# 我们在鼠标拖动的同时获取鼠标的实时位置(x, y),并绘制一个超小的椭圆来代表一个点
root.mainloop()
# 例9-5 读取“ecgdata.txt”的心电图数据,绘制心电图
import tkinter
root = tkinter.Tk()
root.title('心电图')
cv = tkinter.Canvas(root, width=500, height=500)
cv.pack()
ecg = list(open('ecgdata.txt', 'r'))
print(ecg)
x = 0
while x < len(ecg)-1:
# y轴正方向向下。去掉换行符转换为整数,再向下移动300,300这个值是根据数据的值设定,为了能完整展示心电图
y = -int(ecg[x][:-1])+300
y1 = -int(ecg[x+1][:-1])+300
cv.create_line(x, y, x+1, y1, fill='red') # 四个参数是两个坐标点,有两点才能画线
x += 1
root.mainloop()