Tkinter (03) 畫布部件 Canvas

Jason990420發表於2020-07-17

畫布部件的建立及其選項

import tkinter as tk
parent = tk.Tk()
w = tk.Canvas(parent, option=value, ...)
bd or borderwidth 邊框寬度, 預設值 2 點
bg or background 背景色, 預設值 '#E4E4E4' 淡灰色
closeenough 該距離以內都算該部件的範圍之內, float, 預設值 1.0
confine 畫布無法在scrollregion之外滾動, 預設為 True
cursor 滑鼠懸停在畫布上時顯示的游標
height 畫布的 Y 尺寸
highlightbackground 非聚焦時高亮顏色
highlightcolor 聚焦時高亮顏色
highlightthickness 高亮厚度, 預設為 1
relief 畫布的浮雕樣式,預設為 tk.FLAT/td>
scrollregion 畫布可以滾動的區域, tuple (left, top, right, bottom)
selectbackground 所選專案的背景色
selectborderwidth 所選專案的邊框寬度
selectforeground 所選專案的前景色
takefocus TAB 鍵在畫布是否會迴圈焦點, 1 則會, 為空字串, 則僅在具有鍵繫結下迴圈焦點.
width 畫布的X尺寸
xscrollincrement X 維度上的滾動單位,設定為 0, 則可以滾動到的任何位置
xscrollcommand 水平滾動條 scrollbar.set() 方法
yscrollincrement Y 維度上的滾動單位,設定為 0, 則可以滾動到的任何位置
yscrollcommand 垂直滾動條 scrollbar.set() 方法

畫布的一些特性

  • Coordinate 座標 - 左上角為 (0, 0), 右為正的 X 軸, 下為正的 Y 軸.
  • Display list 顯示列表 - 順序為從背景到前景, 新專案加到列表的頂端.
  • Object ID 專案識別碼 - 唯一的整數
  • Tags 標籤名 - string, 可以代表沒有或有一個以上的專案, 一個專案可以沒有或有一個以上的標籤. 標籤用來代表其所有的專案, 可以用來一次設定其相闗的動作.
  • tagOrId 標籤名或專案識別碼
    • integer 代表一個專案的識別碼
    • string, 代表相關專案的標籤名

畫布中專案

import tkinter as tk
canvas = Tk.Canvas(...)
  1. Arc 弧形
    (x0, y0) 為區域的左上角, (x1, y1) 為區域的右下角, 弧就以該區域作為其範圍.
id_ = canvas.create_arc(x0, y0, x1, y1, option, ...)
  1. Bitmap 點陣
    (x, y) 為點陣圖的參考位置座標, 參考的定位由選項 anchor 而定.
id_ = canvas.create_bitmap(x, y, *options)
  1. Image 圖片
    (x, y) 為圖片的參考位置座標, 參考的定位由選項 anchor 而定.
id_ = canvas.create_image(x, y, *options)
  1. Line 線段
    (x0, y0), (x1, y1), …, (xn, yn) 為各線段中的點, 兩點間為直線.
id_ = canvas.create_line(x0, y0, x1, y1, ..., xn, yn, option, ...)
  1. Oval 橢圓
    (x0, y0) 為區域的左上角, (x1, y1) 為區域的右下角(不含), 弧就以該區域作為其範圍.
id_ = canvas.create_oval(x0, y0, x1, y1, option, ...)
  1. Polygon 多邊形
    (x0, y0), (x1, y1), … 為多邊形的各端點.
id_ = canvas.create_polygon(x0, y0, x1, y1, ..., option, ...)
  1. Rectangle 矩形
    (x0, y0), (x1, y1) 外框與內部含 (x0, y0), 外框含 (x1, y1), 內部不含 (x1, y1), 外框為主.
id_ = canvas.create_rectangle(x0, y0, x1, y1, option, ...)
選項 & 說明 弧形 點陣 圖片 線段 橢圓 多邊 矩形 本文 視窗
activebackground
active時, 顏色 0 的顏色, 內定空字串(透明)
activebitmap
active 點陣圖
activedash
active 點線樣式
activefill
active 區域的填色
activeforeground
active 顏色 1 的顏色, 內定空字串(黑色)
activeimage
active 圖片
activeoutline
active 線顏色, 內定空字串(黑色)
activeoutlinestipple
active 線的點陣圖, 內定空字串(黑色)
activestipple
active 區域的點陣圖, 內定空字串(黑色)
activewidth
active 線的寛度, 內定為 1 點素.
anchor
定位方式, 內定為CENTER
arrow
線端的箭頭, 內定無/FIRST/LAST/BOTH
arrowshape
箭頭圖形的三邊長 (d1, d2, d3)
background
顏色值為 0 的顏色, 內定空字串(透明)
bitmap
所使用的點陣圖
capstyle
線端的樣式, 內定為 BUTT.
dash
點線樣式
dashoffset
點線起始間隔
disabledbackground
disabled 顏色值為 0 的顏色, 內定空字串(透明)
disabledbitmap
disabled 點陣圖.
disableddash
disabled 點線樣式
disabledfill
disabled 區域的填色, 內定空字串(透明)
disabledforeground
disabled 顏色值為 1 的顏色, 內定空字串(黑色)
disabledimage
disabled 圖片
disabledoutline
disabled 線顏色, 內定空字串(黑色)
disabledoutlinestipple
disabled 線的點陣圖, 內定空字串(黑色)
disabledstipple
disabled 區域的點陣圖, 內定空字串(黑色)
disabledwidth
disabled 線寛, 內定為 1 點素.
extent
逆時針所涵蓋的角度
fill
區域的填色, 內定空字串(透明)
font
文字字型
foreground
顏色值為 1 的顏色, 內定空字串(黑色)
height
區域的高度
image
使用的圖片.
joinstyle
線轉角的樣式, 內定為 ROUND
justify
多行文字的對方式, 內定為 LEFT
offset
區域對齊的調整偏差
outline
線顏色, 內定空字串(黑色)
outlineoffset
線對齊的調整偏差
outlinestipple
線的點陣圖, 內定空字串(黑色)
smooth
兩點間的平滑方式, 內定False直線/True拋物線
splinesteps
smooth=True, 每一線段以多少個子線段來組成.
start
線的起始角度, x正軸開始, 未設定為整個橢圓形
state
狀態NORMAL內定/HIDDEN/DISABLED
stipple
區域的點陣圖, 內定空字串(黑色)
style
樣式, PIESLICE扇形/CHORD月形/ARC弧形
tags
設定標籤, 單一標籤 str 或多標籤的 tuple.
text
文字字串, 使用 ‘\n’ 分行
width
寛度, 內定為 1 點素. / 文字為字寛
window
要置入的部件

畫布部件有關專案的方法

方法 & 說明
addtag_above(newTag, tagOrId)
在緊接 tagOrId方的一個專案新增新標籤
addtag_all(newTag)
Canvas上的所有專案新增新標籤
addtag_below(newTag, tagOrId)
在緊接 tagOrId 下方的一個專案新增新標籤
addtag_closest(newTag, x, y, halo=None, start=None)
將newTag 新增到最靠近螢幕座標(x, y) 的專案. 如果有多個專案, 則選擇較高的一個. halo代表涵蓋的距離範圍, 專案限定在start專案之下.
addtag_enclosed(newTag, x1, y1, x2, y2)
對區域 (x1, y1), (x2, y2) 中完全涵蓋的所有專案新增 newTagAdd
addtag_overlapping(newTag, x1, y1, x2, y2)
對區域 (x1, y1), (x2, y2) 中有交集的所有專案新增 newTagAdd
addtag_withtag(newTag, tagOrId)
tagOrId 指定的所有專案新增 newTagAdd
bbox(tagOrId=None)
取得tagOrId 所有專案涵蓋的區域(x1, y1), (x2, y2), 如果沒有設定tagOrId, 則為畫布中所有的專案.
canvasx(screenx, gridspacing=None)
將視窗座標 screenx 轉換為畫布座標,併為最近的網格間距 gridspacing 的整數倍.
canvasy(screeny, gridspacing=None)
將視窗座標 screeny 轉換為畫布座標,併為最近的網格間距 gridspacing 的整數倍.
coords(tagOrId, x0, y0, x1, y1, …, xn, yn)
返回 tagOrId 最下層專案的涵蓋範圍, 或/且移動專案到新的座標處 (x0, y0, x1, y1, .., xn, yn)
dchars(tagOrId, first=0, last=first)
firstlast (含) 處, 刪除本文中的字串, 索引firstlast 為integer, 或end 代表最尾端處
delete(tagOrId)
刪除 tagOrId 中的專案
dtag(tagOrId, tagToDelete)
tagOrId 中刪除 tagToDelete 的專案
find_above(tagOrId)
返回緊接 tagOrId 上方的專案 ID, 無則返回空 tuple
find_all()
返回畫布中所有的專案
find_below(tagOrId)
返回緊接 tagOrId 下方的專案 ID, 無則返回空 tuple
find_closest(x, y, halo=None, start=None)
返回接近座標(x,y) 最上層的一個專案的tuple, halo代表涵蓋的距離範圍, 專案限定在start專案之下
find_enclosed(x1, y1, x2, y2)
返回在區域中 (x1, y1), (x2, y2) 完全被涵蓋的所有專案
find_overlapping(x1, y1, x2, y2)
find_withtag(tagOrId)
返回 tagOrId 中所有的專案
focus(tagOrId=None)
聚焦於 tagOrId 第一個專案, 或者返回目前聚焦的專案, 如果沒有聚焦的專案, 則返回空字串
gettags(tagOrId)
返回 tagOrId 中最低專案的所有標籤
icursor(tagOrId, index)
設定可聚焦文字專案的插入游標位置索引
index(tagOrId, specifier)
返回tagOrId 最下層文字專案的specifier 索引值, specifier:
1. tk.INSERT - 目前的位置
2. tk.END - 最後的位置.
3. tk.SEL_FIRST - 選擇的起點, 沒有則出錯tk .TclError.
4. tk.SEL_LAST - 選擇的終點, 沒有則出錯tk.TclError.
5. "@x,y" - 在座標(x, y) 的索引
insert(tagOrId, specifier, text)
tagOrId 最下層文字專案中, 於 specifier 處插入字串 text
itemcget(tagOrId, option)
返回 tagOrId 最下層專案的選項 option
itemconfigure(tagOrId, option, …)
設定或返回 tagOrId 最下層專案的選項 option
move(tagOrId, xAmount, yAmount)
移動 tagOrId 的專案, 位置偏移量為 xAmount, yAmount
postscript(option, …)
以Encapsulated PostScript 格式返回畫布的內容, 選項options:
colormode 色彩模式- color 彩色/gray 灰度/ mono 黑白,
file - 儲存檔名, 沒有設定則返回字串
height - 畫布高度
rotate - 橫式(False) or 直式(True) 方向
x - 列印的最左方座標
y -列印的最上方座標
width - 畫布寛度
scale(tagOrId, xOffset, yOffset, xScale, yScale)
以(xoffset, yoffset) 為參考點來縮放tagOrId 中的專案, 縮放比率為xScaleyScale, 文字專案不會縮放, 但位置可能會改變
scan_dragto(x, y, gain=10.0)
滑鼠鍵按下事件處理程式中已標記位置時, 滑鼠滾動事件處理程式拖弋捲動畫布, (x, y) 為位置, gain 為畫布捲動的速率,值越大越快
scan_mark(x, y)
滑鼠鍵按下事件處理程式中標記位置 (x, y)
select_adjust(oid, specifier)
調整專案 oid 的文字選擇區以包含索引 specifier, 定位處也會重新設定
select_clear()
去除選擇
select_from(oid, specifier)
設定專案 oid 選擇區的起始索引處 specifier
select_item()
返回目前選擇區的專案識別碼, 如果沒有選擇區, 則返回 None
select_to(oid, specifier)
設定專案 oid 選擇區的停止索引處 specifier
tag_bind(tagOrId, sequence=None, function=None, add=None)
繫結tagOrId 專案sequence 事件的處理程式function, add'+' 代表新增處理程式, 否則將取代所有舊的程式. 繫結對新增或移除的專案沒有作用
tag_lower(tagOrId, belowThis)
在顯示列表中移動 tagOrId 中的專案到 aboveThis 下方, 座標位置不變
tag_raise(tagOrId, aboveThis)
在顯示列表中移動 tagOrId 中的專案到 aboveThis 上方, 座標位置不變
tag_unbind(tagOrId, sequence, funcId=None)
移除 tagOdID 專案對 sequence 事件的繫結函式 funcId
type(tagOrId)
返回tagOrId 中第一個專案的型別, arc, bitmap, image, line, oval, polygon, rectangle, text, 或window
xview(tk.MOVETO, fraction)
供水平滾動條scrollbar 選項command 使用, fraction 0.0 為最左處, 1.0 為右處
xview(tk.SCROLL, n, what)
水平滾動畫布n 個單位, 單位whattk.UNITStk.PAGES, < code>tk.UNITS 的大小由畫布的xscrollincrement 選項而定, tk.PAGES 的大小是畫布度的9/10 code>
xview_moveto(fraction)
同 xview(tk.MOVETO, fraction)
xview_scroll(n, what)
同 .xview(tk.SCROLL, n, what)
yview(tk.MOVETO, fraction)
垂直滾動畫布, 類似 xview(tk.MOVETO,…)
yview(tk.SCROLL, n, what)
垂直滾動畫布, 類似 xview(tk.SCROLL,…)
yview_moveto(fraction)
垂直滾動畫布, 類似 xview()
yview_scroll(n, what)
垂直滾動畫布, 類似 xview(), xview_moveto(), and xview_scroll()

範例視窗及程式碼

Tkinter (03) 畫布部件 Canvas

import math
import tkinter as tk

root = tk.Tk(className="canvas demo")

canvas = tk.Canvas(root, bg='green', width=640, height=480)
canvas.grid()

r = 220
x_offset, y_offset = 20, 240
points = [(x+x_offset, r*math.sin(x/90*math.pi)+y_offset) for x in range(600)]
ids    = [canvas.create_oval(x-1, y-1, x+1, y+1, fill='white', outline='white')
           for x, y in points]

line = {'arrow':tk.LAST, 'fill':'yellow', 'width':4}
line_x = canvas.create_line(10, 240, 630, 240, **line)
line_y = canvas.create_line(20, 470,  20,  10, **line)

x_label = canvas.create_text(620, 250, anchor=tk.E,  fill='yellow',
    text='Degree')
y_label = canvas.create_text( 25,  90, anchor=tk.NW, fill='yellow',
    text='Sin Curve', angle=90)
# angle option added for new version tkinter.

root.mainloop()
本作品採用《CC 協議》,轉載必須註明作者和本文連結

Jason Yang

相關文章