天天看點

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