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