天天看点

cp9_1_1.py

#!/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()





           
上一篇: cp9_3_1.py
下一篇: Cp2_3_1.py