Python Tkinter Canvas畫布控件詳解
Canvas 控件具有兩個功能,首先它可以用來繪制各種圖形,比如弧形、線條、橢圓形、多邊形和矩形等,其次 Canvas 控件還可以用來展示圖片(包括位圖),我們將這些繪制在畫布控件上的圖形,稱之為“畫布對象”。
每一個畫布對象都有一個“唯一身份ID”,這是 Tkinter 自動為其創(chuàng)建的,從而方便控制和操作這些畫布對象。
通過 Canvas 控件創(chuàng)建一個簡單的圖形編輯器,讓用戶可以達(dá)到自定義圖形的目的,就像使用畫筆在畫布上繪畫一樣,可以繪制各式各樣的形狀,從而有更好的人機交互體驗。
Canvas控件基本屬性
下面對 Canvas 控件的常用屬性做簡單的介紹,如下表所示:
| 屬性 | 方法 |
|---|---|
| background(bg) | 指定 Canvas 控件的背景顏色 |
| borderwidth(bd) | 指定 Canvas 控件的邊框?qū)挾?/td> |
| closeenough | 1. 指定一個距離,當(dāng)鼠標(biāo)與畫布對象的距離小于該值時,認(rèn)為鼠標(biāo)位于畫布對象上 2. 該選項是一個浮點類型的值 |
| confine | 1. 指定 Canvas 控件是否允許滾動超出 scrollregion 選項設(shè)置的滾動范圍,默認(rèn)值為 True |
| selectbackground | 指定當(dāng)畫布對象(即在 Canvas 畫布上繪制的圖形)被選中時的背景色, |
| selectborderwidth | 指定當(dāng)畫布對象被選中時的邊框?qū)挾龋ㄟx中邊框) |
| selectforeground | 指定當(dāng)畫布對象被選中時的前景色 |
| state | 設(shè)置 Canvas 的狀態(tài):"normal" 或 "disabled",默認(rèn)值是 "normal",注意,該值不會影響畫布對象的狀態(tài) |
| takefocus | 指定使用 Tab 鍵可以將焦點移動到輸入框中,默認(rèn)為開啟,將該選項設(shè)置為 False 避免焦點在此輸入框中 |
| width | 指定 Canvas 的寬度,單位為像素 |
| xscrollcommand | 與 scrollbar(滾動條)控件相關(guān)聯(lián)(沿著 x 軸水平方向) |
| xscrollincrement | 1. 該選項指定 Canvas 水平滾動的“步長” 2. 例如 '3c' 表示 3 厘米,還可以選擇的單位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大約是 '1i' 等于 '72p') 3. 默認(rèn)為 0,表示可以水平滾動到任意位置 |
| yscrollcommand | 與 scrollbar 控件(滾動條)相關(guān)聯(lián)(沿著 y 軸垂直方向) |
| yscrollincrement | 1. 該選項指定 Canvas 垂直滾動的“步長” 2. 例如 '3c' 表示 3 厘米,還可以選擇的單位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大約是 '1i' 等于 '72p') 3. 默認(rèn)值是 0,表示可以垂直方向滾動到任意位置 |
上述屬性是用來設(shè)置 Canvas 控件的,下面示例定義了出一張畫布(Canvas),如下所示:
import tkinter as tk
window = tk.Tk()
window.title("C語言中文網(wǎng)")
window.geometry('400x200')
# 創(chuàng)庫不允許改變
window.resizable(0,0)
window.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網(wǎng)logo.ico')
# 創(chuàng)建畫布
canvas = tk.Canvas(window,
bg='#CDC9A5',
height=200,
width=300)
canvas.pack()
window.mainloop()程序運行結(jié)果如下:

圖1:tkinter Canvas控件
Canvas控件繪圖常用方法
Cansvas 控件提供了一系列繪制幾何圖形的常用方法,下面對這些方法做簡單介紹:
| 方法 | 說明 |
|---|---|
| create_line(x0, y0, x1, y1, ... , xn, yn, options) | 1. 根據(jù)給定的坐標(biāo)創(chuàng)建一條或者多條線段; 2. 參數(shù) x0,y0,x1,y1,...,xn,yn 定義線條的坐標(biāo); 3. 參數(shù) options 表示其他可選參數(shù) |
| create_oval(x0, y0, x1, y1, options) | 1. 繪制一個圓形或橢圓形; 2. 參數(shù) x0 與 y0 定義繪圖區(qū)域的左上角坐標(biāo);參數(shù) x1 與 y1 定義繪圖區(qū)域的右下角坐標(biāo); 3. 參數(shù) options 表示其他可選參數(shù) |
| create_polygon(x0, y0, x1, y1, ... , xn, yn, options) | 1. 繪制一個至少三個點的多邊形; 2. 參數(shù) x0、y0、x1、y1、...、xn、yn 定義多邊形的坐標(biāo); 3. 參數(shù) options 表示其他可選參數(shù) |
| create_rectangle(x0, y0, x1, y1, options) | 1. 繪制一個矩形; 2. 參數(shù) x0 與 y0 定義矩形的左上角坐標(biāo);參數(shù) x 與 y1 定義矩形的右下角坐標(biāo); 3. 參數(shù) options 表示其他可選參數(shù) |
| create_text(x0, y0, text, options) | 1. 繪制一個文字字符串。其中 2. 參數(shù) x0 與 y0 定義文字字符串的左上角坐標(biāo),參數(shù) text 定義文字字符串的文字; 3. 參數(shù) options 表示其他可選參數(shù) |
| create_image(x, y, image) | 1. 創(chuàng)建一個圖片; 2. 參數(shù) x 與 y 定義圖片的左上角坐標(biāo); 3. 參數(shù) image 定義圖片的來源,必須是 tkinter 模塊的 BitmapImage 類或 PhotoImage 類的實例變量。 |
| create_bitmap(x, y, bitmap) | 1. 創(chuàng)建一個位圖; 2. 參數(shù) x 與 y 定義位圖的左上角坐標(biāo); 3. 參數(shù) bitmap 定義位圖的來源,參數(shù)值可以是 gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning 或 question,或者也可以直接使用 XBM(X Bitmap)類型的文件,此時需要在 XBM 文件名稱前添加一個 @ 符號,例如 bitmap=@hello.xbm |
| create_arc(coord, start, extent, fill) | 1. 繪制一個弧形; 2. 參數(shù) coord 定義畫弧形區(qū)塊的左上角與右下角坐標(biāo); 3. 參數(shù) start 定義畫弧形區(qū)塊的起始角度(逆時針方向); 4. 參數(shù) extent 定義畫弧形區(qū)塊的結(jié)束角度(逆時針方向); 5. 參數(shù) fill 定義填充弧形區(qū)塊的顏色。 |
注意:上述方法都會返回一個畫布對象的唯一 ID。關(guān)于 options 參數(shù),下面會通過一個示例對經(jīng)常使用的參數(shù)做相關(guān)介紹。(但由于可選參數(shù)較多,并且每個方法中的參數(shù)作用大同小異,因此對它們不再逐一列舉)
從上述表格不難看出,Canvas 控件采用了坐標(biāo)系的方式來確定畫布中的每一點。一般情況下,默認(rèn)主窗口的左上角為坐標(biāo)原點,這種坐標(biāo)系被稱作為“窗口坐標(biāo)系”,但也會存在另外一種情況,即畫布的大小可能大于主窗口,當(dāng)發(fā)生這種情況的時,可以采用帶滾動條的 Canvas 控件,此時會以畫布的左上角為坐標(biāo)原點,我們將這種坐標(biāo)系稱為“畫布坐標(biāo)系”。
繪制直線
下面示例展示了如何在畫布(Canvas控件)上繪制一條虛線和實線,代碼如下:
from tkinter import *
root = Tk()
# 設(shè)置窗口的背景顏色以區(qū)別畫布
root.config(bg='#87CEEB')
root.title("C語言中文網(wǎng)")
root.geometry('450x350')
root.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網(wǎng)logo.ico')
# 設(shè)置畫布的背景顏色為白色
cv=Canvas(root,bg="white",width =300, height = 250)
# 將控件放置在主窗口中
cv.pack()
# 設(shè)置坐標(biāo)點,此處可以元組的形式來設(shè)置坐標(biāo)點
point=[(10,20),(20,30),(30,40),(40,100),(80,120),(150,90)]
# 創(chuàng)建畫布,添加線條
# fill 參數(shù)指定填充的顏色,如果為空字符串,則表示透明
# dash 參數(shù)表示用來繪制虛線輪廓,元組參數(shù),分別代表虛線中線段的長度和線段之間的間隔
# arrow 設(shè)線段的箭頭樣式,默認(rèn)不帶箭頭,參數(shù)值 first 表示添加箭頭帶線段開始位置,last表示到末尾占位置,both表示兩端均添加
# smooth 布爾值參數(shù),表示是否以曲線的樣式劃線,默認(rèn)為 False
# width 控制線寬
line1=cv.create_line(point,fill="purple",dash=(1,1),arrow=LAST,width=5)
print('線段line1的畫布id號:',line1)
line2=cv.create_line(point,fill="red",arrow=BOTH,smooth=TRUE,width=5)
print('線段line2的畫布id號:',line2)
# 移動其中一條線段,只需要更改其坐標(biāo)就可以,使用 coords()方法移動曲線
cv.coords(line2,50,30,25,35,35,40,50,120,60,170,10,180)
# 顯示窗口
root.mainloop()程序運行的最終結(jié)果,見下圖:

圖1:tkinter Canvas控件
上述示例中涉及了一部分參數(shù),比如 fill、dash、arrow 等,下表對 create_line() 函數(shù)的相關(guān)參數(shù)做了簡單介紹:
| 屬性 | 說明 |
|---|---|
| activedash | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,繪制虛線 |
| activefill | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,填充顏色 |
| activestipple | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,指定填充的位圖 |
| activewidth | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,指定邊框的寬度 |
| arrow | 1. 默認(rèn)線段是不帶箭頭的,通過設(shè)置該選項添加箭頭到線段中 2. "first" 表示添加箭頭到線段開始的位置 3. "last" 表示添加箭頭到線段結(jié)束的位置 4. "both" 表示兩端均添加箭頭 |
| arrowshape | 1. 用一個三元組來指定箭頭的形狀,默認(rèn)值是 (8, 10, 3),元組中的數(shù)值分別代表箭頭中三條邊的長度 |
| capstyle | 1. 指定線段兩端的樣式,默認(rèn)值是 "butt" 2. 該選項的值可以是: "butt"(線段的兩段平切于起點和終點) "projecting"(線段的兩段在起點和終點的位置將 width 選項設(shè)置的長度分別延長一半) "round"(線段的兩段在起點和終點的位置將 width設(shè)置的長度分別延長一半,并以圓角進(jìn)行繪制) |
| dash | 繪制虛線,該選項值是一個整數(shù)元組,元組中的元素分別代表短線的長度和間隔,比如 (3, 5) 代表 3 個像素的短線和 5 個像素的間隔 |
| dashoffset | 指定虛線開始的偏移位置,比如 dash=(5, 1, 2, 1),dashoffset=3,則從 2 開始畫虛線 |
| disableddash | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,繪制虛線 |
| disabledfill | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,填充顏色 |
| disabledstipple | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,指定填充的位圖 |
| disabledwidth | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,指定邊框的寬度 |
| fill | 1. 指定填充的顏色,空字符串表示透明 |
| joinstyle | 1. 指定當(dāng)繪制兩個相鄰線段之間時接口的樣式,默認(rèn)為 "round" 2. 該選項的值可以是: "round"(以連接點為圓心,1/2 width 選項設(shè)置的長度為半徑來繪制圓角) "bevel"(在連接點處將兩線段的夾角做平切操作) "miter"(沿著兩線段的夾角延伸至一個點) |
| offset | 指定當(dāng)點畫模式時填充位圖的偏移 |
| smooth | 默認(rèn)值為 False,若設(shè)置為 True,表示將以曲線的樣式代替所繪線段 |
| splinesteps | 當(dāng)繪制曲線的時,該選項指定由多少條折線來構(gòu)成曲線,默認(rèn)值是 12,這里需要注意,只有當(dāng) smooth 選項為 True 時該選項才會生效。 |
| state | 指定該畫布對象的狀態(tài),默認(rèn)值為 "normal",參數(shù)值有 "normal","disabled"(不可用)和 "hidden"(隱藏)三種狀態(tài)。 |
| stipple | 指定一個位圖進(jìn)行填充,默認(rèn)值為空字符串,表示實心 |
| tags | 為創(chuàng)建的畫布對象添加標(biāo)簽 |
| width | 指定邊框的寬度 |
對于扇形、矩形、三角形、圓形等,這些封閉式圖形,它們由輪廓線和填充顏色兩部分組成。在繪制這些圖形時相關(guān)函數(shù)的可選參數(shù)與上述表格也存在略微差異,下面以繪制扇形的 create_arc() 函數(shù)為例做簡單的介紹:
| 屬性 | 方法 |
|---|---|
| activedash | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,繪制虛線 |
| activefill | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,填充顏色 |
| activeoutline | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,繪制輪廓線 |
| activeoutlinestipple | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,指定填充輪廓的位圖 |
| activestipple | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,指定填充的位圖 |
| activewidth | 當(dāng)畫布對象狀態(tài)為 "active" 的時候,指定邊框的寬度 |
| dash | 指定繪制虛線輪廓,與繪制線段的含義相同 |
| dashoffset | 指定虛線輪廓開始的偏移位置 |
| disableddash | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,繪制虛線 |
| disabledfill | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,填充顏色 |
| disabledoutline | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,繪制輪廓線 |
| disabledoutlinestipple | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,指定填充輪廓的位圖 |
| disabledstipple | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,指定填充的位圖 |
| disabledwidth | 當(dāng)畫布對象狀態(tài)為 "disabled" 的時候,指定邊框的寬度 |
| extent | 指定跨度(從 start 選項指定的位置開始到結(jié)束位置的角度)默認(rèn)值是 90.0 |
| fill | 與上述表格的含義相同,表示指定的填充顏色,若為空字符串則為透明色 |
| offset | 指定當(dāng)點畫模式時填充位置的偏移,參數(shù)值為 "x,y"坐標(biāo)偏移和位置偏移兩種方式,比如 "ne"/"e" 等 |
| outline | 指定輪廓的顏色 |
| outlineoffset | 指定當(dāng)點畫模式繪制輪廓時位圖的偏移 |
| outlinestipple | 當(dāng) outline 選項被設(shè)置時,該選項用于指定一個位圖來填充邊框,默認(rèn)值是空字符串,表示黑色 |
| start | 指定起始位置的偏移角度 |
| style | 默認(rèn)創(chuàng)建的是扇形,指定該方法創(chuàng)建的是扇形("pieslice")、弓形("chord")還是弧形("arc") |
| tags | 為創(chuàng)建的畫布對象添加標(biāo)簽 |
| width | 指定邊框的寬度 |
在實際的使用的過程中經(jīng)常用到的參數(shù)有 dash、fill、outline、extend 和 start,但是這么多的參數(shù)我們也不可能都記住,這時查手冊是一種很好的方法,官網(wǎng)文檔地址:點擊前往。
下面讓我們來一組繪制幾何圖形的簡單示例:
from tkinter import *
root = Tk()
# 設(shè)置主窗口區(qū)的背景顏色以區(qū)別畫布區(qū)的顏色
root.config(bg='#8DB6CD')
root.title("C語言中文網(wǎng)")
root.geometry('500x400')
root.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網(wǎng)logo.ico')
# 將畫布設(shè)置為白色
canvas = Canvas(root,width = 400,height = 400,bg='white')
# 設(shè)置基準(zhǔn)坐標(biāo)
x0,y0,x1,y1 = 10,10,80,80
# 繪制扇形,起始角度為 0 度,結(jié)束角度為 270, 扇形區(qū)域填充色為淡藍(lán)色,輪廓線為藍(lán)色,線寬為 2px
arc = canvas.create_arc(x0, y0, x1, y1,start = 0, extent = 270, fill = '#B0E0E6',outline ='blue',width = 2)
# 繪制圓形
oval = canvas.create_oval(x0+150, y0, x1+150, y1,fill ='#CD950C',outline = 'blue',width=2)
# 繪制矩形,并將輪廓線設(shè)置為透明色,即不顯示最外圍的輪廓線,默認(rèn)為黑色
rect = canvas.create_rectangle(x0,y0+100,x1,y1+100,fill='red',outline = '')
# 繪制一個三角形,填充色為綠色
trigon = canvas.create_polygon(80,80,150,80,200,200, outline="", fill="green",)
# 當(dāng)然也可以繪制一個任意多邊形,只要你的坐標(biāo)正確就可以
# 繪制一個多邊形,首先定義一系列的多邊形上的坐標(biāo)點
poly_points=[(0,280),(140,200),(140,240),(270,240),(270,320),(140,320),(140,360)]
polygon = canvas.create_polygon(poly_points,fill="#BF3EFF")
# 放置畫布在主窗口
canvas.pack()
# 顯示窗口
root.mainloop()程序運行結(jié)果如下所示:

圖2:tkinter繪制幾何圖形
注意:create_rectangle() 方法的前兩個參數(shù)決定了矩形的左上角坐標(biāo),后兩個參數(shù)決定了矩形的右下角坐標(biāo);另外 create_oval() 方法并不是只能繪制圓形,還能繪制橢圓形,這取決于傳入的參數(shù)。
除了能夠繪制幾何圖形之外,Tkinter 還可以展示圖片、創(chuàng)建位圖以及文本信息等,示例如下所示:
from tkinter import *
root=Tk()
# # 設(shè)置主窗口區(qū)的背景顏色以區(qū)別畫布區(qū)的顏色
root.config(bg='#8DB6CD')
root.title("C語言中文網(wǎng)")
root.geometry('500x300')
root.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網(wǎng)logo.ico')
# # 將畫布設(shè)置為白色
cv = Canvas(root,bg='white')
# tkinter 提供的內(nèi)置位圖名稱
bitmaps = ["error", "gray75", "gray50", "gray25", "gray12",
"hourglass", "info", "questhead", "question", "warning"]
# 列出所有的位圖樣式
for i in range(len(bitmaps)):
# 前兩個參數(shù)指定一個位圖的位置,后續(xù)依次排列
cv.create_bitmap((i+1)*30,30,bitmap=bitmaps[i])
#并在畫布上添加文本
# 參數(shù)說明,前兩個參數(shù)(x0,y0)參照點,指定文字字符串的左上角坐標(biāo)
# anchor 指定了文本的對于參照點的相對位置,以方位來指定,比如 W/E/N/S等
cv.create_text(30,80,text = "tkinter內(nèi)置位圖預(yù)覽",fill ='#7CCD7C',anchor = W,font =('微軟雅黑',15,'bold'))
# 展示圖片,使用 PhotoImage()來加載圖片
img = PhotoImage (file="C:/Users/Administrator/Desktop/c.biancheng.gif")
cv.create_image(30,150,image = img,anchor =W)
cv.create_text(30,220,text = "圖片預(yù)覽",fill ='#7CCD7C',anchor = W,font =('微軟雅黑',15,'bold'))
cv.pack()
mainloop()程序運行結(jié)果如下:

圖3:tkinter Canvas控件
注意,添加到 Canvas 上的對象會一直保留直著。如果你希望修改它們,您可以使用 coords() 和 move() 方法來移動畫布上的對象,當(dāng)然您可以使用 delete() 來刪除它們,示例如下:
from tkinter import *
root=Tk()
# # 設(shè)置主窗口區(qū)的背景顏色以區(qū)別畫布區(qū)的顏色
root.config(bg='#8DB6CD')
root.title("C語言中文網(wǎng)")
root.geometry('500x300')
root.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網(wǎng)logo.ico')
# 定義移動函數(shù)
def move_img():
# 定義移動坐標(biāo)
cv.move(image1,50,30)
# # 將畫布設(shè)置為白色
cv = Canvas(root,bg='white')
# 使用 PhotoImage()來加載圖片
img = PhotoImage (file="C:/Users/Administrator/Desktop/c.biancheng.gif")
image1=cv.create_image(30,150,image = img,anchor =W)
# 將按鈕放置在畫布中
btn=Button(cv,text="點擊移動畫布",bg="#8A8A8A",activebackground="#7CCD7C",command=move_img)
# 在指定位置創(chuàng)建一個窗口控件,tags來添加標(biāo)簽
cv.create_window(365,250,height=30,width=30,window=btn)
# 調(diào)用delete() 刪除畫布對象,若傳入ALL,則刪除所有的畫布對象
#cv.delete(image1)
cv.pack()
# 顯示窗口
root.mainloop()程序運行結(jié)果如下:

圖4:移動畫布對象
注意:使用畫布控件允許用戶自己進(jìn)行繪圖,但這需要與 tkinter 事件機制相配合才能實現(xiàn),在后續(xù)會做相關(guān)介紹。
到此這篇關(guān)于Python Tkinter Canvas畫布控件詳解的文章就介紹到這了,更多相關(guān)Python Tkinter Canvas內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Python中的 oct 函數(shù)與 min 函數(shù)
本文主要介紹了Python oct 函數(shù)與 min 函數(shù);oct 函數(shù)是 Python 內(nèi)置函數(shù),主要將一個整數(shù)轉(zhuǎn)為八進(jìn)制,與 ord 函數(shù) / chr 函數(shù) 有點類似;min 函數(shù)返回給定參數(shù)的最小值,參數(shù)可以為序列語法,感興趣的小伙伴請繼續(xù)閱讀下文2021-09-09
matplotlib共享坐標(biāo)軸的實現(xiàn)(X或Y坐標(biāo)軸)
在作圖的過程中,我們經(jīng)常會遇到子圖共用坐標(biāo)軸的情況,或是共用橫軸標(biāo)軸,也可能是縱坐標(biāo)軸。本文就介紹了matplotlib共享坐標(biāo)軸,感興趣的可以了解一下2021-05-05
python中g(shù)etaddrinfo()基本用法實例分析
這篇文章主要介紹了python中g(shù)etaddrinfo()基本用法,實例分析了Python中使用getaddrinfo方法進(jìn)行IP地址解析的基本技巧,需要的朋友可以參考下2015-06-06
Python根據(jù)字典的值查詢出對應(yīng)的鍵的方法
這篇文章主要介紹了Python根據(jù)字典的值查詢出對應(yīng)的鍵的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python?數(shù)據(jù)篩選功能實現(xiàn)
這篇文章主要介紹了Python?數(shù)據(jù)篩選,無論是在數(shù)據(jù)分析還是數(shù)據(jù)挖掘的時候,數(shù)據(jù)篩選總會涉及到,這里我總結(jié)了一下python中列表,字典,數(shù)據(jù)框中一些常用的數(shù)據(jù)篩選的方法,需要的朋友可以參考下2023-04-04

