最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Python Tk GUI系列筆記(tkinter篇(中)) 第十九章~第二十三章

2023-08-20 13:35 作者:水母山楂  | 我要投稿

〇、前言

此系列主要介紹tkinter庫——Tk圖形用戶界面(GUI)及其相關(guān)內(nèi)容,內(nèi)容參考以下網(wǎng)站:

TkDocs:https://tkdocs.com/(前四十一章)

C語言中文網(wǎng):http://c.biancheng.net/tkinter/(前三十一章)

Python tkinter(GUI編程)模塊最完整教程(上/中/下):(前四十一章)

https://blog.csdn.net/qq_48979387/article/details/125706562

https://blog.csdn.net/qq_48979387/article/details/125806479

https://blog.csdn.net/qq_48979387/article/details/125768994

Python tkinter一些十分靈活的運用方式和實用函數(shù):(第四十二章)

https://blog.csdn.net/qq_48979387/article/details/119695934

tkinter.ttk --- Tk 風(fēng)格的控件:

https://docs.python.org/zh-cn/3.11/library/tkinter.ttk.html(33~41章)

Tcl/Tk文檔:

https://www.tcl.tk/man/tcl8.6/TkCmd/contents.html(前四十二章)

ttkbootstrap:https://ttkbootstrap.readthedocs.io/en/latest/zh/(43~53章)

其他參考會在章節(jié)前列出

部分內(nèi)容來源網(wǎng)絡(luò)

# 操作系統(tǒng)為Windows 7

Python版本3.8,Tk版本8.6

# 在“屬性項數(shù)據(jù)庫”及以后章節(jié)使用Python版本3.10,對運行結(jié)果基本無影響

運行結(jié)果的窗口圖片會縮放到80%,96 dpi

有些運行結(jié)果會使用gif動圖展示,或是有額外的補充文件,需到Python tkinter result文件中的查看

# gif錄制軟件:ScreenToGif

# 此系列的WPS筆記會在本系列的最后一個專欄給出

顏色代表含義:

淡灰色:注釋,一般前面有#

綠色:示例

橙色:補充

紫色:示例中的input用戶輸入內(nèi)容

紅色、藍色:突出或裝飾文字作用

部分內(nèi)容可能不嚴謹或者錯誤,歡迎指出

# 如果Python無tkinter可參考這篇專欄cv14759634


十九、文本框控件(Text)

(1)、概念

文本框控件用于顯示和編輯多行文本,允許用戶以不同的樣式、屬性來顯示和編輯文本。它可以包含純文本或格式化文本,同時支持嵌入圖片等

# 本章中“行”, “段”或“邏輯行”(logical lines)代表文本框控件中用回車換行的文本,而“行文本”或“顯示行”(display lines)代表顯示在文本框中一行之內(nèi)的文本。例如這個注釋是一段,有三行文本

(2)、演示圖

?


(3)、構(gòu)造方法

tkinter.Text(master=None, cnf={}, **kw)

(4)、屬性項

autoseparators, background, bd, bg, blockcursor, borderwidth, cursor, endline, exportselection, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, inactiveselectbackground, insertbackground, insertborderwidth, insertofftime, insertontime, insertunfocussed, insertwidth, maxundo, padx, pady, relief, selectbackground, selectborderwidth, selectforeground, setgrid, spacing1, spacing2, spacing3, startline, state, tabs, tabstyle, takefocus, undo, width, wrap, xscrollcommand, yscrollcommand

1.blockcursor

是一個布爾值,指定插入光標是否繪制成一個字符大小的矩形方塊。默認值為False,即一條細的垂直線

# 這個矩形方塊外觀相當(dāng)于cmd中點擊Insert后的光標外觀

2.inactiveselectbackground

當(dāng)窗口沒有焦點時選定區(qū)的顏色。如果為空則窗口沒有焦點不顯示選定區(qū)

# 選定區(qū)是選定文本的區(qū)域

3.insertunfocussed

指定當(dāng)控件沒有焦點時插入光標的樣式。'none'(默認)代表不顯示光標,'hollow'代表空心方塊,'solid'代表實心方塊

當(dāng)blockcursor為False時,'hollow'與'solid'基本沒區(qū)別

示例:

blockcursor為True
inactiveselectbackground為'red'失去焦點時


blockcursor為True,insertunfocussed為'hollow'失去焦點時

4.startline, endline

都是一個整數(shù)的行索引,代表底層文本數(shù)據(jù)存儲的行。startline代表儲存的第一行,endline代表儲存的內(nèi)容最后一行的之后一行。指定空字符串可以重置它們一開始代表的行

設(shè)置startline和endline可以顯示文本框較大文本中的一部分

示例:

?


指定startline=5, endline=8后:

?


指定startline='', endline=''后:

?


5.wrap

指定如果處理過寬的行文本。'none'代表每行文本正好顯示為一段,'char'(默認)代表過長的每行文本會在任意字符斷開,'word'代表過長的每行文本會在適合的最后一個單詞斷開

# “一個單詞”是指任何數(shù)量相鄰字母、數(shù)字或下劃線組成的字符串

示例:

'none':


'char':


'word':


6.spacing1

指定每行文本上方的空白間隔(段前間距)。默認值為0

7.spacing2

指定每行文本自動換行的各行之間的空白間隔。默認值為0

8.spacing3

指定每行文本下方的空白間隔(段后間距)。默認值為0

9.undo

是否啟用撤銷功能,默認值為False

# 實際上也是是否啟用重做功能

10.maxundo

允許撤銷的數(shù)量,值為-1代表無限次

11.autoseparators

指定在撤銷功能啟用后,是否自動插入撤銷分隔符(分隔操作記錄)

# 撤銷/重做機制的概述見后文“撤銷/重做機制”


12.tabs

設(shè)置Tab之間的停頓

默認一個Tab是八個字符

設(shè)置特定的Tab,則要將該屬性項值設(shè)置為一個序列,序列中的元素是相對于控件左邊緣的距離(不包括邊框)

序列中的元素應(yīng)是正數(shù)且是遞增的

元素后面可以跟一個字符串,代表Tab后文本的對齊方式:

'left'(默認):Tab后的文本左邊緣與Tab位置對齊

'right':Tab后的文本右邊緣與Tab位置對齊

'center':Tab后的文本在Tab位置的中間

'numeric':Tab后的文本如果有小數(shù)點,則最右端的小數(shù)點與Tab位置對齊;如果沒有小數(shù)點,最左端數(shù)字的最小位右邊緣與Tab位置對齊;如果沒有數(shù)字,則文本右邊緣與Tab位置對齊

?

如果序列沒有足夠的元素則會使用最后元素的間隔和對齊方式推斷后面的Tab

如果屬性項沒有指定或序列為空,則使用默認值

補充:使用tkinter.font模塊Font類的measure方法乘以4,可以設(shè)置Tab是4個字符

13.tabstyle

指定一行中Tab停頓與該行文本中Tab的關(guān)系,可以是以下值:

'tabular':一行文本中每個Tab字符與每個Tab停頓互相關(guān)聯(lián)。如果Tab字符處于Tab停頓的右邊,則會插入一個空格

'wordprocessor':一行文本中每個Tab字符與右邊的第一個Tab停頓相關(guān)聯(lián)

示例1:

默認停頓:


tabs=('1c', '3c', '7c'):


tabs=('1c', '3c', RIGHT, '7c'):?

?three移動到Tab的左邊


tabs=('1c', '3c', NUMERIC, '7c'):??

小數(shù)點移動到Tab位置


示例2:

tabstyle=('tabular'):


tabstyle=('wordprocessor'):


# 當(dāng)為'tabular'時,第三組超過Tab停頓插入一個空格;當(dāng)為'wordprocessor'時,第三組超過Tab停頓移到右邊下一個Tab停頓

(5)、屬性項的默認值及注意事項

background, bg, fg, foreground, highlightbackground, highlightcolor, insertbackground, selectbackground, selectforeground:默認值由系統(tǒng)指定

takefocus, xscrollcommand, yscrollcommand:默認值為空字符串

bd:默認值為1

borderwidth:默認值為1

cursor:默認值為'xterm'

exportselection:默認值為1

font:默認值為'TkFixedFont'

height:默認值為24

highlightthickness:默認值為0

insertborderwidth:默認值為0

insertofftime:默認值為300

insertontime:默認值為600

insertwidth:默認值為2

padx:默認值為1

pady:默認值為1

relief:默認值為'sunken'

selectborderwidth:默認值為0

state:默認值為'normal'

width:默認值為80

(6)、索引

使用索引指定字符在文本框中的位置

# 除非指定display,否則索引只對應(yīng)當(dāng)前顯示的字符,不會對應(yīng)被省略隱藏的字符

1.格式

"base modifier modifier modifier ..."

# 空格不是必要的

2.base

索引的開始,可以是以下形式

2.1.line.char

對應(yīng)line行中的第char個字符。line從1開始,char從0開始

如果char為'end',則是line行結(jié)束處的換行符

2.2.@x,y

對應(yīng)文本框X和Y坐標的字符

2.3.end

對應(yīng)文本框結(jié)束的字符(最后一個換行符之后的一個字符)

# 標記mark和標簽tag見后文

2.4.mark

對應(yīng)標記名為mark的字符

2.5.tag.first

對應(yīng)文本框控件中第一個標簽為tag的字符

2.6.tag.last

對應(yīng)文本框控件中最后一個標簽為tag的字符

2.7.嵌入對象

對應(yīng)嵌入到文本框控件中的圖像或控件

3.modifier

通過modifier修飾索引,可以是以下形式

# 空格不是必要的(除了字母之間的空格),[]中代表可選,/表示多選1,modifier中的字符串可以縮寫

3.1.+/- count [display/any] chars

將索引按字符向后/前移動,count指定移動的字符數(shù)

如果指定display,則被省略的字符會被跳過而不被計算在內(nèi);如果指定any,則任何字符都會被計算在內(nèi)(但圖像和控件不會);否則是以索引位置進行計算

# 由于歷史原因,需要指定any才是按字符移動

3.2.+/- count [display/any] indices

將索引按索引位置向后/前移動,count指定移動的字符數(shù)

如果指定display,則被省略的索引會被跳過而不被計算在內(nèi);如果指定any(默認),則任何索引都會被計算在內(nèi)

3.3.+/- count [display/any] lines

將索引按行向后/前移動,count指定移動的行數(shù)

如果指定display,則顯示行會被計算在內(nèi);如果指定any(默認),則每個邏輯行只會被計算一次


3.4.[display] linestart

將索引調(diào)整為該行第一個索引

如果指定display,則是顯示行第一個索引,否則是邏輯行第一個索引

3.5.[display] lineend

將索引調(diào)整為該行最后一個索引

如果指定display,則是顯示行最后一個索引,否則是邏輯行最后一個索引

3.6.[display] wordstart

將索引調(diào)整為當(dāng)前索引所在單詞的第一個字符

如果指定display,則被省略的字符會被跳過而不被計算在內(nèi),否則任何字符都會被計算在內(nèi)

3.7.[display] wordend

將索引調(diào)整為當(dāng)前索引所在單詞的最后一個文本之后的字符

如果指定display,則被省略的字符會被跳過而不被計算在內(nèi),否則任何字符都會被計算在內(nèi)

示例:

文本:

01234567890123456789012345678901234567890123456789

0123456789

abc def ghij

0123456789

0123456789

0123456789

屬性項:

font=('黑體', 20), width=35, height=8

結(jié)果圖:

索引:??# “-->”后的是對應(yīng)字符和“l(fā)ine.char”索引

1.2 --> '2' (1.2)

2.2 --> '2' (2.2) ?# 結(jié)果圖中的第二邏輯行是第三顯示行

end --> '' (7.0)

1.2 + 3 any chars --> '5' (1.5) ?# 可縮寫為'1.2+3a c'

1.2 + 3 any line --> '2' (4.2)

1.2 + 3 display line --> 'c' (3.2) ?# 第一邏輯行的第二顯示行計算在內(nèi)

1.0 display lineend --> '4' (1.34)

3.8 wordend --> '\n' (3.12) ?# 最后一個文本之后的字符是換行符


(7)、基本方法

1.bbox(index)

返回元組(x, y, width, height)描述索引index對應(yīng)字符的矩形邊界

如果字符在屏幕上不可見則width, height為0

2.compare(index1, op, index2)

比較index1和index2的索引位置,返回布爾值

op——關(guān)系運算符,值是'<', '<=', '==' '>=', '>', '!='中的一個

如果index1和index2對應(yīng)文本同一字符,則它們是相等的;如果index1對應(yīng)的字符在index2對應(yīng)的字符之前,則index1 < index2

3.delete(index1, index2=None)

刪除區(qū)間[index1, index2)之間的字符。如果只給出index1,則只刪除index1對應(yīng)的字符;如果index1 > index2,則不會刪除任何字符

4.get(index1, index2=None)

返回區(qū)間[index1, index2)之間的字符。如果只給出index1,則只返回index1對應(yīng)的字符;如果index1 > index2,則不會返回任何字符

嵌入對象將被忽略,多行文本會用'\n'分隔

5.index(index)

返回index索引對應(yīng)的'line.char'形式

6.insert(index, chars, *args)

在index處插入文本chars。如果提供額外參數(shù),則第一個參數(shù)視為標簽添加到chars上(如果是可迭代對象則是每個元素(字符串除外)),后面可以再加多組這樣的chars-tags對

示例:

insert(1.0, 'aaaa', ['tag_a', 'tag_b'], 'bbbb', 'tag_b')意為在1.0處插入aaaabbbb,其中aaaa被添加tag_a和tag_b索引,bbbb被添加tag_b索引

7.see(index)

滾動視圖使index可見

(8)、標記

·?標記是文本框中的某個浮動的位置,處于兩個字符之間,它會與相鄰的文本浮動

·?刪除標記周圍文本不會刪除標記

·?實測標記名可以是任何字符串,但建議最好不要與像'end', '1.0'之類的索引重名

·?特殊標記'insert'是插入光標的位置,'current'是最接近鼠標指針的位置

1.標記重力

標記是處于兩個字符之間的位置,標記重力指定當(dāng)文本插入到標記位置時標記附著的字符,它的方向是'left'或'right'

2.標記相關(guān)方法

2.1.mark_gravity(markName, direction=None)

只傳入markName參數(shù)則返回對應(yīng)標記的重力方向

如果傳入direction,則它需是'left'或'right',用于改變標記的“重力”方向

2.2.mark_set(markName, index)

如果名為markName的標記不存在,則以'right'的重力創(chuàng)建一個標記,并移動到index位置

如果存在,則將名為markName的標記移動到index位置

2.3.mark_unset(*markNames)

刪除markNames中的所有標記

# 特殊標記'insert'和'current'不能被刪除

2.4.mark_names()

返回控件中所有標記名組成的元組,包括'insert'和'current'


2.5.mark_next(index)

返回索引index后面的標記名稱,實測無標記返回None

如果index是一個標記名,則是該標記的名之后的一個標記

2.6.mark_previous(index)

返回索引index前面的標記名稱,實測無標記返回None

如果index是一個標記名,則是該標記的名之前的一個標記

(9)、標簽

·?標簽是字符串,可以包含任何字符,但最好避免是'end', '1.0'之類的名稱

·?一個標簽可以與任何數(shù)量的字符相關(guān)聯(lián),一個字符也可以與任何數(shù)量的標簽相關(guān)聯(lián)

·?標簽?zāi)芸刂葡嚓P(guān)聯(lián)字符的外觀和功能

·?標簽之間有一個優(yōu)先順序,擁有更高優(yōu)先順序的標簽,它所對應(yīng)的屬性項優(yōu)先應(yīng)用

·?特殊標簽'sel',代表當(dāng)前選定區(qū)的文本

1.標簽相關(guān)方法

1.1.tag_add(tagName, index1, *args)

將標簽tagName與區(qū)間[index1, args中第一個位置參數(shù))相關(guān)聯(lián),后面可以再加多組這樣的位置參數(shù)。如果最后一組這樣的參數(shù)不成對,則關(guān)聯(lián)最后一組前面參數(shù)的單個字符

1.2.tag_remove(tagName, index1, index2=None)

將標簽tagName從區(qū)間[index1, index2)中刪除。如果只給出index1,則只刪除index1對應(yīng)的單個字符

1.3.tag_delete(*tagNames)

刪除tagNames中的所有標簽

1.4.tag_names(index=None)

返回index對應(yīng)字符關(guān)聯(lián)的所有標簽名組成的元組。無參數(shù)調(diào)用返回文本框控件中的所有標簽(包括特殊標簽'sel')

1.5.tag_configure(tagName, cnf=None, **kw)

# 別名:tag_config

與控件的configure()相似,這里是修改標簽TagName的屬性項

1.6.tag_cget(tagName, option)

以字符串形式返回標簽的屬性項option的值

1.7.tag_raise(tagName, aboveThis=None)

將標簽tagName的優(yōu)先順序升到標簽aboveThis的上面

省略aboveThis則將其優(yōu)先順序升到最高

1.8.tag_lower(tagName, belowThis=None)

將標簽tagName的優(yōu)先順序降到標簽aboveThis的下面

省略aboveThis則將其優(yōu)先順序降到最低

1.9.tag_ranges(tagName)

以元組形式返回描述tagName相關(guān)聯(lián)字符的范圍

元組中每兩個元素描述一個范圍區(qū)間[arg1, arg2)

1.10.tag_nextrange(tagName, index1, index2=None)

在區(qū)間[index1, index2)中從左向右搜索第一個標簽tagName關(guān)聯(lián)字符范圍的初始索引,以元組形式返回此初始索引對應(yīng)的范圍

如果省略index2,則index2默認是文本框末尾;如果搜索無結(jié)果則返回空元組

# 范圍的“初始索引”指范圍區(qū)間[arg1, arg2)中的arg1

1.11.tag_prevrange(tagName, index1, index2=None)

在區(qū)間[index2, index1)中從右向左搜索第一個標簽tagName關(guān)聯(lián)字符范圍的初始索引,以元組形式返回此初始索引對應(yīng)的范圍

如果省略index2,則index2默認是文本框開頭;如果搜索無結(jié)果則返回空元組


示例:

文本框內(nèi)容:012345678901234567890123456789

調(diào)用控件方法:

tag_add('my_tag', '1.1', '1.5', '1.8', '1.9', '1.12', '1.15') ?# 將'my_tag'標簽關(guān)聯(lián)到后面范圍

tag_config('my_tag', background='green') ?# 將'my_tag'標簽關(guān)聯(lián)字符的背景色變?yōu)榫G色

當(dāng)前結(jié)果:


調(diào)用控件方法:

tag_nextrange('my_tag', '1.2', '1.13') --> ('1.8', '1.9')

tag_prevrange('my_tag', '1.13', '1.2') --> ('1.12', '1.15')

# 從'1.2'到'1.13',('1.8', '1.9')中初始索引'1.8'是第一個被包含的;從'1.13'到'1.2',('1.12', '1.15')中初始索引'1.12'是一個被包含的

1.12.tag_bind(tagName, sequence, func, add=None)

同控件方法bind()

# 更多信息見章節(jié)“事件處理”

1.13.tag_unbind(tagName, sequence, funcid=None)

同控件方法unbind()

# 更多信息見章節(jié)“事件處理”

2.標簽屬性項

使用tag_config()修改標簽的屬性項可以改變相關(guān)聯(lián)文本的外觀

2.1.background

指定背景色

2.2.foreground

指定前景色

2.3.bgstipple

指定背景填充的位圖,空字符串(默認值)表示實心

2.4.fgstipple

指定前景填充的位圖,空字符串(默認值)表示實心

2.5.borderwidth

指定邊框?qū)挾?/span>

2.6.relief

指定邊框樣式

2.7.elide

是否被省略。省略的數(shù)據(jù)(字符、圖像、嵌入控件)不會顯示,但進一步的行為和正常數(shù)據(jù)一樣

2.8.font

指定字體

2.9.justify

指定多行文本的對齊方式。值為'left'(默認值), 'center', 'right'(或它們的縮寫)

# 顯示行的對齊方式由第一個非省略字符的此屬性值決定

2.10.lmargin1

指定首行縮進的像素

2.11.lmargin2

指定后續(xù)行縮進的像素

2.12.lmargincolor

指定縮進的背景色

2.13.rmargin

指定文本右縮進的像素

2.14.rmargincolor

指定文本右縮進的背景色

2.15.offset

指定文本的基線與所在行的基線在垂直方向上的偏移量,單位是像素。偏移量為正則是向上偏移,為負則上向下偏移

# 使用此屬性可以做出上標和下標

示例:

文本內(nèi)容:H2SO4 + 2NaOH = Na2SO4 + 2H2O

調(diào)用控件方法:

tag_add('subscript', '1.1', '1.2', '1.4', '1.5', '1.18', '1.19', '1.21', '1.22', '1.27', '1.28')

tag_config('subscript', offset=-5)

當(dāng)前結(jié)果:


2.16.underline

指定是否繪制下劃線

2.17.underlinefg

指定下劃線的顏色

2.18.overstrike

指定是否繪制刪除線

2.19.overstrikefg

指定刪除線的顏色

2.20.selectbackground

指定選定區(qū)的背景色

2.21.selectforeground

指定選定區(qū)的前景色

2.22.wrap

2.23.spacing1

2.24.spacing2

2.25.spacing3

2.26.tabs

2.27.tabstyle

見文本框控件中的同名屬性項

(10)、嵌入對象

通過以下控件方法,可以在文本框中嵌入圖像、控件,圖像和控件都具有屬性項

1.嵌入圖像

1.1.相關(guān)方法

1.1.1.image_create(index, cnf={}, **kw)

在index處嵌入圖像,傳入鍵值對設(shè)置圖像的屬性項,返回一個唯一的標識符(用作索引)

1.1.2.image_configure(index, cnf=None, **kw)

與控件的configure()相似,這里是修改index對應(yīng)圖像的屬性項

1.1.3.image_cget(index, option)

以字符串形式返回index對應(yīng)圖像的屬性項option的值

1.1.4.image_names()

返回當(dāng)前文本框中嵌入圖像名稱組成的元組

1.2.屬性項

1.2.1.align

指定圖像在行中的顯示位置,可選擇以下的值:

'top':圖像頂部與行的頂部對齊

'center':圖像在行內(nèi)居中

'bottom':圖像底部與行的底部對齊

'baseline':圖像底部與行的基線對齊

示例: ?# 藍色矩形高度小于行高

?


1.2.2.image

指定圖像對象

1.2.3.name

指定嵌入圖像的標識符名(重復(fù)標識符會將#nn附加到后面)

1.2.4.padx

指定水平外邊距(嵌入對象周圍的空白區(qū)域),單位是像素

1.2.5.pady

指定垂直外邊距,單位是像素

2.嵌入控件

# 注意,如果嵌入控件的堆疊順序在文本框控件之下,則不會顯示

# 注意,一個控件同時只能在一個控件中被包裝,如果想要一次創(chuàng)建多個控件建議使用create屬性項

2.1.相關(guān)方法

2.1.1.window_create(index, cnf={}, **kw)

在index處嵌入控件,傳入鍵值對設(shè)置控件的屬性項,返回None

2.1.2.window_configure(index, cnf=None, **kw)

# 別名:window_config

與控件的configure()相似,這里是修改index對應(yīng)控件的屬性項

2.1.3.window_cget(index, option)

以字符串形式返回index對應(yīng)控件的屬性項option的值

2.1.4.window_names()

返回當(dāng)前文本框中嵌入控件名稱組成的元組

2.2.屬性項

2.2.1.create

指定一個函數(shù),函數(shù)的返回值將作為嵌入到文本框的控件

2.2.2.stretch

指定一個布爾值,表示控件是否被垂直拉伸以填充其行

# 這會使align屬性被忽略。pady屬性仍會起作用

2.2.3.window

指定控件對象

2.2.4.align

2.2.5.padx

2.2.6.pady

見嵌入圖像中的同名屬性項


(11)、撤銷/重做機制與修改標志

1.撤銷/重做機制

# 實測撤銷/重做機制對嵌入對象無作用

文本框控件有一個無限制的撤銷和重做機制,可以取消或恢復(fù)對控件內(nèi)文本的編輯

下面是撤銷/重做堆棧的工作方式:

·?對控件內(nèi)文本的編輯動作(插入、刪除)都會堆到撤銷堆棧上

·?分隔符插入到編輯動作之間。分隔符可以自動插入(autoseparators為True),也可以手動插入(控件方法edit_separator())

·?撤銷操作會反轉(zhuǎn)所有堆到撤銷/重做堆棧的編輯動作,直到達到一個分隔符或堆棧內(nèi)容用完

·?撤銷操作的反轉(zhuǎn)操作會插入重做堆棧

·?每當(dāng)有新的編輯動作記錄在撤銷堆棧時,重做堆棧會被清空

2.修改標志

·?通過文本框控件的修改標志可以追蹤其內(nèi)容變化

·?修改標志會在文本框內(nèi)文本插入、刪除、撤銷操作、重做操作時被設(shè)置為1,表示文本內(nèi)容被修改

·?修改標志可以使用edit_modified()方法查詢、修改

3.相關(guān)方法

3.1.edit(*args)

文本內(nèi)容編輯相關(guān)的方法,第一個參數(shù)指定模式(見下面的方法名),后面參數(shù)是對應(yīng)方法的參數(shù)

# 模式還可以是'canundo'和'canredo',會返回撤銷/重做堆棧是否不為空

3.2.edit_modified(arg=None)

無參數(shù)調(diào)用返回文本框控件修改標志的值。如果傳入布爾值arg,則將文本框控件修改標志的值設(shè)置為arg

3.3.edit_undo()

執(zhí)行一次撤銷操作,當(dāng)撤銷堆棧為空時拋出TclError。只當(dāng)undo屬性為True時才起作用

3.4.edit_redo()

執(zhí)行一次重做操作,當(dāng)重做堆棧為空時拋出TclError。只當(dāng)undo屬性為True時才起作用

3.5.edit_separator()

向撤銷堆棧插入一個分隔符。只當(dāng)undo屬性為True時才起作用

3.6.edit_reset()

清空撤銷和重做堆棧

(12)、對等文本框控件(Peer text widgets)

# “對等文本框控件”為自譯

1.概念

多個文本框控件,有相同的基礎(chǔ)數(shù)據(jù)(文本、圖像、標記、標簽、...)但有著不同屬性項,這樣的文本框控件稱為對等文本框控件(Peer text widgets)

2.特點

·?對等文本框控件基礎(chǔ)數(shù)據(jù)共享,但'sel'標簽、'insert'標記、'current'標記、嵌入式控件不是共享的

·?對等文本框控件可以設(shè)置不同屬性項,但undo, maxundo, autoseparators除外

·?對等文本框控件通過設(shè)置startline和endline可以只顯示某些行

·?對等文本框控件的“原始”文本框控件被刪除后,不會影響其他對等控件


3.相關(guān)方法

3.1.peer_create(newPathName, cnf={}, **kw)

創(chuàng)建調(diào)用文本框控件的對等文本框控件,傳入鍵值對設(shè)置不同的屬性項

調(diào)用后,新控件的路徑名稱將是newPathName

newPathName必須不存在,否則拋出TclError異常

# 對等控件和“原始”控件的startline和endline屬性默認相同

# 創(chuàng)建對等文本框控件,可以先創(chuàng)建一個控件,再調(diào)用它的destroy()銷毀它,然后用此方法將它替換成對等文本框控件

3.2.peer_names()

返回調(diào)用文本框控件的對等文本框控件元組(不包括自己)

示例:


運行結(jié)果:

?


隨便修改一個文本框內(nèi)容后:

?



(13)、更多方法

1.count(index1, index2, *args)

計算并以元組形式返回index1和index2之間(不包括index2)由args給出的每個計數(shù)項的數(shù)量。如果index1在index2之后,則計數(shù)結(jié)果是負數(shù)

計數(shù)項如下:

'indices'(默認):計算所有的字符和嵌入對象

'displayindices':計算所有的非省略字符和嵌入對象

'chars':計算所有的字符

'displaychars':計算所有的非省略字符

'lines':計算所有的邏輯行,不包括index2所在的行

'displaylines':計算所有的顯示行,不包括index2所在的行

'xpixels':計算index1到index2之間水平字符(不包括index2)最左邊像素到最右邊像素的水平像素數(shù)量

'ypixels':計算index1到index2之間垂直字符(不包括index2)最上邊像素到最下邊像素的水平像素數(shù)量

# 實測'xpixels'和'ypixels'需要先更新控件才能正常計數(shù)

示例:


運行結(jié)果: ?# 圖片沒有縮放,但在插入圖片時可能會模糊


2.dlineinfo(index)

返回一個五元組,該元組描述索引index所在顯示行的矩形區(qū)域。前兩個元素是這個矩形的左上角x和y坐標,三、四元素是該矩形的寬度和高度,第五個元素是從矩形上到下的基線位置。單位都是像素

如果索引index所有的顯示上在屏幕上不可見,則返回None

3.dump(index1, index2=None, command=None, **kw)

返回區(qū)間[index1, index2)中內(nèi)容組成的三元組列表。如果只給出index1,則只是index1對應(yīng)內(nèi)容組成的三元組列表

內(nèi)容包括:文本、標記、標簽、圖像、控件

通過關(guān)鍵字參數(shù),如果指定'all', 'image', 'mark', 'tag', 'text'或'window'中一個多個為真,則返回相應(yīng)內(nèi)容。沒有指定則默認使用'all'

返回結(jié)果是一個三元組列表,三元組形為(key, value, index),分別是類型、值、索引。這個三元組列表是按照內(nèi)容順序的。類型tagon表示標簽范圍開始、類型tagoff表示標簽范圍結(jié)束

command——是一個函數(shù)。如果給出,則三元組列表的每個三元組都會傳入三個位置參數(shù)調(diào)用該函數(shù),且返回值變?yōu)镹one

示例:


運行結(jié)果:

[('tagon', 'red', '1.0'), ('text', '012', '1.0'), ('tagoff', 'red', '1.3'), ('text', '3456789', '1.3')]

[('tagon', 'red', '1.0'), ('tagoff', 'red', '1.3'), ('tagon', 'red', '2.3'), ('tagoff', 'red', '2.6'), ('tagon', 'red', '3.6'), ('tagoff', 'red', '3.9')]

在索引2.0處讀取內(nèi)容012,類型:text

在索引2.3處讀取內(nèi)容red,類型:tagon

在索引2.3處讀取內(nèi)容345,類型:text

在索引2.6處讀取內(nèi)容red,類型:tagoff

在索引2.6處讀取內(nèi)容6789,類型:text


4.search(pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None, elide=None)

從index開始查找符合pattern的文本,默認返回匹配文本的第一個字符的索引

指定以下參數(shù)值為True來控制查找:

forwards(默認):從index(包含)開始從左向右查找

backwards:從index(不包含)開始從右向左查找

# 由于各種原因,backwards會比forwards慢得多

exact(默認):匹配文本必須與pattern的文本相同

regexp:將pattern視為正則表達式

nocase:忽略大小寫

elide:查找省略的字符

count——指定一個控制變量,將匹配文本的字符數(shù)存儲到該控制變量中。指定會方法返回空字符串

stopindex——指定查找停止的索引。如果是forwards則不包含,如果是backwards則包含

5.replace(index1, index2, chars, *args)

將區(qū)間[index1, index)之間的文本替換成chars。關(guān)于args參見insert()方法

?

支持XView和YView

補充:tkinter包內(nèi)模塊scrolledtext

這個模塊提供一個名為ScrolledText的類,這個類繼承自Text類,但是多了一個y方向的滾動條

tkinter.scrolledtext.ScrolledText(master=None, **kw)

這個類的對象的frame屬性是文本框控件和滾動條控件布局在其內(nèi)的框架控件,vbar屬性是滾動條控件


二十、畫布控件(Canvas)

(1)、概念

畫布控件是一個矩形區(qū)域,可以在上面繪制各種圖形,也可以展示圖片、文字、控件

# 下文“畫布對象”指畫布包含的對象,而不是畫布控件本身

1.畫布坐標

畫布使用坐標系的方式來確定畫布中的每一點

1.1.窗口坐標系

以畫布控件在主窗口范圍的左上角為坐標原點的坐標系

1.2.畫布坐標系

以整個畫布的左上角為坐標原點的坐標系

# 此章出現(xiàn)的坐標如果沒特別說明則是畫布坐標系的坐標

補充:

當(dāng)畫布控件scrollregion屬性w與n都設(shè)置為0時,窗口坐標系(0, 0)是畫布坐標系(-2, -2)

當(dāng)畫布控件scrollregion屬性w與n都設(shè)置為2時,窗口坐標系與畫布坐標系原點相同,也就是兩個坐標系重合

當(dāng)畫布控件highlightthickness屬性設(shè)置為0且scrollregion屬性w與n都設(shè)置為0時,窗口坐標系(0, 0)是畫布坐標系(0, 0)

2.顯示列表(display list)

畫布中的對象顯示是有順序的,顯示列表中處于前面的對象比處于后面的對象先顯示(也就是如果兩個對象重疊,前面的在下面),新創(chuàng)建的對象會添加在顯示列表的最后

可以通過方法tag_raise()和tag_lower()重新排列顯示列表

顯示列表中處于最前的是顯示列表中最低的,處于最后的是顯示列表中最高的

3.tagOrId參數(shù)

tagOrId參數(shù)指定畫布上一個或多個對象

當(dāng)指定值是一個整數(shù)時,會被認為是對象ID,否則會被認為是標簽

tagOrId參數(shù)的值可以包含"&&"(與), "||"(或), '^'(異或), '!'(非)邏輯表達式和括號

3.1.對象ID(object ID)

畫布上的對象在創(chuàng)建時都會分配一個唯一的ID,所有對象的ID值都是簡單的整數(shù),在畫布控件的生命周期中一個對象的ID不會改變且該ID不會重復(fù)使用

3.2.標簽(tag)

一個標簽可以與畫布上任何數(shù)量的對象相關(guān)聯(lián),一個對象也可以與任何數(shù)量的標簽相關(guān)聯(lián)

標簽是字符串,但不可以是代表整數(shù)的字符串(例如"123")

3.2.1.標簽all

這個標簽與畫布中每個對象相關(guān)聯(lián)

3.2.2.標簽current

這個標簽與鼠標放在的對象相關(guān)聯(lián)

(2)、演示圖

(3)、構(gòu)造方法

tkinter.Canvas(master=None, cnf={}, **kw)

(4)、屬性項

background, bd, bg, borderwidth, closeenough, confine, cursor, height, highlightbackground, highlightcolor, highlightthickness, insertbackground, insertborderwidth, insertofftime, insertontime, insertwidth, offset, relief, scrollregion, selectbackground, selectborderwidth, selectforeground, state, takefocus, width, xscrollcommand, xscrollincrement, yscrollcommand, yscrollincrement

# offset見后文“標準屬性項”

1.closeenough

指定鼠標必須離對象多近才被認為在其中。是一個浮點數(shù),默認值為1.0

2.scrollregion

是一個元組(w, n, e, s),定義畫布可以在多大范圍內(nèi)滾動,w是左側(cè)、n是頂部、e是右側(cè)、s是底部

# 在畫布控件中使用滾動條需指定該屬性

3.confine

如果為True(默認值),則畫布不能在scrollregion設(shè)置的范圍之外滾動

4.xscrollincrement

設(shè)置畫布水平滾動的“步長”。默認值為0,表示可以水平滾動到任意位置

# 例如設(shè)置20,則只能滾動到20倍數(shù)的水平位置

5.yscrollincrement

設(shè)置畫布垂直滾動的“步長”。默認值為0,表示可以垂直滾動到任意位置

示例1:


運行結(jié)果:

運行時:


將滾動條拉到最右邊后:

?

按幾下右箭頭后:


示例2:

# 區(qū)分窗口坐標系和畫布坐標系

# 主窗口設(shè)置200x200,畫布控件屬性scrollregion設(shè)置(52, 52, 100, 100)并place(x=100, y=100)

?


上圖中黃色矩形的左上角的點是窗口坐標系(0, 0),是畫布坐標系(50, 50)

這個點同時向左和上平移50個像素就是窗口坐標系(-50, -50),是畫布坐標系(0, 0)

下圖紅色是窗口坐標系、藍色是畫布坐標系:

?


(5)、屬性項的默認值及注意事項

background, bg, highlightbackground, highlightcolor, insertbackground, selectbackground, selectforeground:默認值由系統(tǒng)指定

cursor, takefocus, xscrollcommand, yscrollcommand:默認值為空字符串

bd:默認值為0

borderwidth:默認值為0

height:默認值為'7c'

highlightthickness:默認值為2

insertborderwidth:默認值為0

insertofftime:默認值為300

insertontime:默認值為600

insertwidth:默認值為2

relief:默認值為'flat'

selectborderwidth:默認值為1

state:默認值為'normal'

width:默認值為'10c'

(6)、畫布對象

使用畫布控件的create_*()方法,可以在畫布上繪制各種圖形

畫布對象也有相應(yīng)的屬性項,在創(chuàng)建時指定或使用畫布控件的itemconfig()或itemconfigure()方法指定

傳入的坐標都是畫布坐標系的坐標

(7)、標準屬性項

畫布對象有一些共同的屬性,這里統(tǒng)一說明

# 后面會在畫布對象屬性項編號的開頭說明適用的標準屬性項

1.anchor

畫布對象內(nèi)的錨點位置,值必須是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。'center'是默認值

# 錨點位置參見place()方法中的anchor

2.dash, activedash, disableddash

# 具體內(nèi)容見官方文檔

繪制虛線,因為在Windows只支持有限的dash patterns,所以不能設(shè)置長度和間距,只有四種虛線:

短虛線:字符'.'

長虛線:字符'-'/','/'_'

點劃線:字符'.-,_'中任意兩個組合

點劃點線:字符'.-,_'中任意三個組合或更多組合

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)繪制

# 當(dāng)鼠標在畫布對象中時被認為是'active'狀態(tài),即使itemcget()獲取值不是'active'

3.dashoff

在圖案開始繪制前跳過的像素數(shù)

# 實測無效

4.fill , activefill, disabledfill

指定填充的顏色,空字符串表示透明。對于文本是前景色

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)填充

5.outline, activeoutline, disabledoutline

指定輪廓的顏色,空字符串表示透明

# 實測對于橢圓、矩形、弧形默認值是空字符串,其他是黑色

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)繪制

6.stipple, activestipple, disabledstipple

指定填充的位圖,空字符串(默認值)表示實心。如果fill屬性是空字符串則無效果

# 實測默認值是黑色

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)填充

7.outlinestipple, activeoutlinestipple, disabledoutlinestipple

指定輪廓的位圖,空字符串(默認值)表示實心。如果fill屬性是空字符串則無效果

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)填充

8.offset, outlineoffset

分別用于偏移填充位圖和輪廓位圖的點陣圖案

兩個屬性的值形式如下:

'x,y':在畫布坐標系以x和y偏移點陣圖案

'#x,y':在窗口坐標系以x和y偏移點陣圖案

'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center':將點陣圖案中心與畫布對應(yīng)對應(yīng)方位對齊

9.state

畫布對象的狀態(tài),值是'normal', 'disabled'或'hidden'(隱藏)

10.tags

畫布對象的標簽,值可以是用空格分隔標簽的字符串、列表(每一個元素是一個標簽)、元組等

11.width, activewidth, disabledwidth

指定邊框的寬度

# 不同畫布對象作用不同,會具體說明

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)的寬度

(8)、線條

由給定坐標創(chuàng)建的一條或多條線段。會用線條將給定坐標按順序相連(首末項不相連)

1.創(chuàng)建

create_line(*args, **kw)

create_line(x0, y0, x1, y1, ..., xn, yn, option, ...)

傳入的位置參數(shù)視為坐標,傳入的關(guān)鍵字參數(shù)視為屬性項。傳入序列視為坐標,傳入字典鍵視為屬性項、值視為值

返回對象ID

# 后面將不會再對此說明

2.屬性項

適用的標準屬性項:

dash ,activedash ,disableddash ,dashoffset ,fill ,activefill ,disabledfill ,stipple ,activestipple ,disabledstipple ,state ,tags ,width ,activewidth ,disabledwidth

2.1.width

指定線條的寬度

?

線條特定屬性項:

2.2.arrow

默認線條沒有箭頭,值為'frist'在線條開始位置添加箭頭,值為'last'在線條結(jié)束位置添加箭頭,值為'both'在線條兩端添加箭頭

2.3.arrowshape

指定箭頭的形狀,值是一個三元組(d1, d2, d3),默認值是(8, 10, 3)

?

圖片來源:https://tkdocs.com/shipman/create_line.html


?

# 六種樣式介紹來自C語言中文網(wǎng)

2.4.capstyle

指定線條兩端的樣式,值為'butt'(默認值), 'projecting', 'round'

'butt':線段的兩段平切于起點和終點

'projecting':線段的兩段在起點和終點的位置將width屬性設(shè)置的長度分別延長一半

'round':線段的兩段在起點和終點的位置將width設(shè)置的長度分別延長一半,并以圓角進行繪制

2.5.joinstyle

指定線端連接處的樣式,值為'round'(默認值), 'bevel', 'miter'

'round':以連接點為圓心,1/2width屬性設(shè)置的長度為半徑來繪制圓角

'bevel':在連接點處將兩線段的夾角做平切操作

'miter':沿著兩線段的夾角延伸至一個點

?

圖片來源:https://tkdocs.com/shipman/cap-join-styles.html


2.6.smooth

默認值為False,如果為True,則繪制貝塞爾曲線替代所繪線段

2.7.splinesteps

指定多少條折線構(gòu)成貝塞爾曲線,默認值是12。只能當(dāng)smooth為True是才能生效


示例:

運行結(jié)果:

?


# 拉伸窗口會發(fā)現(xiàn)info位圖的線條圖案移動

(9)、橢圓

橢圓包含特殊情況的圓。橢圓位置和尺寸由左上角坐標(x0, y0)和右下角坐標(x1, y1)組成的矩形決定

1.創(chuàng)建

create_oval(*args, **kw)

create_oval(x0, y0, x1, y1, option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlineoffset, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth, disabledwidth

2.1.width

指定輪廓的寬度

?

橢圓沒有特定屬性項

示例:


運行結(jié)果:

?


(10)、矩形

由左上角坐標(x0, y0)和右下角坐標(x1, y1)創(chuàng)建的矩形

輪廓位于矩形頂部和左側(cè)的內(nèi)部,但位于矩形底部和右側(cè)的外部

# 也就是說如果去掉輪廓指定fill,實際填充的范圍是(x0, y0)到(x1-1, y1-1)

1.創(chuàng)建

create_rectangle(*args, **kw)

create_rectangle(x0, y0, x1, y1, option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlineoffset, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth, disabledwidth

2.1.width

指定輪廓的寬度

?

矩形沒有特定屬性項

(11)、多邊形

用至少三個不共線的頂點依次連成的封閉圖形(首末項相連)

# 實際上多邊形的outline默認值為空字符串,所以如果指定該屬性項,兩個頂點或共線也可以顯示出(線段)

1.創(chuàng)建

create_polygon(*args, **kw)

create_polygon(x0, y0, x1, y1, ..., option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlineoffset, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth, disabledwidth

?

多邊形特定屬性項:

joinstyle, smooth, splinesteps:見線條中對應(yīng)屬性項

# 與使用線條圍成的多邊形區(qū)別是內(nèi)部的點不認為是在線條內(nèi)部

(12)、弧形

橢圓包含特殊情況的扇形、弓形、半圓形等?;⌒挝恢煤统叽缬勺笊辖亲鴺?x0, y0)和右下角坐標(x1, y1)組成的矩形決定,由屬性start, extent定義起始和結(jié)束角度

1.創(chuàng)建

create_arc(*args, **kw)

create_arc(x0, y0, x1, y1, option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlineoffset, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth, disabledwidth

2.1.width

指定輪廓的寬度

?

弧形特定屬性項:

2.2.start

指定起始角度,圓心所在的x軸正半軸為0.0度,默認值0.0度

值為正數(shù)表示向逆時針轉(zhuǎn)動起始角度,負數(shù)表示向順時針轉(zhuǎn)動起始角度

2.3.extent

指定結(jié)束角度,弧線從start屬性指定的起始角度轉(zhuǎn)動,默認值90.0度

值為正數(shù)表示向逆時針轉(zhuǎn)動,負數(shù)表示向順時針轉(zhuǎn)動

# 以上值如果>=360或<=-360會模360,所有指定start或extent值360相當(dāng)于值為0.0

2.4.style

指定繪制的樣式,值為'pieslice'(扇形,默認值), 'chord'(弓形), 'arc'(弧形)


?

圖片來源:https://tkdocs.com/shipman/create_arc.html


示例:


運行結(jié)果:

?


(13)、文本

由坐標(x, y)定義文本的錨點坐標,text屬性定義文本內(nèi)容

1.創(chuàng)建

create_text(*args, **kw)

create_text(x, y, option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

anchor, fill, activefill, disabledfill, stipple, activestipple, disabledstipple, state, tags

2.1.fill

指定文本的前景色

?

文本特定屬性項:

font, justify, text, underline:見本文檔相應(yīng)控件屬性,其中justify默認值為'left'

2.2.width

見Label控件中的wraplength屬性

2.3.angle

文本以錨點為旋轉(zhuǎn)中心逆時針轉(zhuǎn)動的度數(shù)

(14)、位圖

由坐標(x, y)定義位圖的錨點坐標,bitmap屬性定義顯示的位圖

1.創(chuàng)建

create_bitmap(*args, **kw)

create_bitmap(x, y, option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

anchor, state, tags

?

位圖特定屬性項:

2.1.bitmap, activebitmap, disabledbitmap

指定顯示的位圖

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)

2.2.background, activebackground, disabledbackground

指定位圖中比特位為0的顏色,空字符串表示透明

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)

2.3.foreground, activeforeground, disabledforeground

指定位圖中比特位為1的顏色,空字符串表示透明

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)

(15)、圖片

由坐標(x, y)定義圖片的錨點坐標,bitmap屬性定義顯示的圖片

1.創(chuàng)建

create_image(*args, **kw)

create_image(x, y, option, ...)

返回對象ID

2.屬性項

適用的標準屬性項:

anchor, state, tags

?

圖片特定屬性項:

2.1.image, activeimage, disabledimage

指定顯示的圖片

?

分別是在畫布對象'normal', 'active', 'disabled'狀態(tài)

(16)、控件

由坐標(x, y)定義控件的錨點坐標,window屬性定義顯示的控件

注意控件總是遮住與它重疊的任何圖形,所以不能在控件上繪制其他圖形。另外注意控件不會被包含其的畫布邊框剪切顯示(除非父控件是畫布),而是被父控件剪切顯示

# 控件是一個矩形區(qū)域

# 實測如果繪制的控件之前被pack()、grid()或place(),繪制后會取消

1.創(chuàng)建

create_window(*args, **kw)

create_window(x, y, option, ...)

返回對象ID

2.屬性項

使用的標準屬性項:

anchor, state, tags

?

控件特定屬性項:

2.1.window

指定顯示的控件。注意這個控件必須是畫布控件的子控件或畫布控件某個祖先控件的子控件

# 這里的“祖先控件”指父控件、父控件的父控件、父控件的父控件的父控件......

2.2.width, height

控件的寬度和高度,單位是像素。如果省略,表示控件設(shè)置

(17)、方法

1.關(guān)于索引

索引對應(yīng)字符或坐標,索引適用于下面方法中的first、last與index參數(shù)

# 坐標是(x, y)而不是單獨的x坐標或y坐標

1.1.數(shù)字

正向索引(從0開始),可以是整數(shù)或字符串

# 對于線條和多邊形的索引如果數(shù)字是奇數(shù)則自動減1,也就是它們的索引是0、2、4、...

1.2.@x,y

x, y是數(shù)字,分別被視為畫布的X, Y坐標(像素為單位,數(shù)字不能是'3c'等形式),索引對應(yīng)字符或坐標

# X, Y坐標是窗口坐標系的坐標

對于位于文本之外的坐標,索引對應(yīng)最接近該坐標點的那一行的第一個或最后一關(guān)字符

對于位于線條和多邊形的坐標,索引對應(yīng)最接近該坐標點的線條和多邊形的坐標點

1.3.end

索引對應(yīng)字符或坐標之后的一項

# 以下索引對于線條和多邊形無效

1.4.insert

索引對應(yīng)插入光標的下一個字符

1.5.sel.first

索引對應(yīng)選中文字的第一個字符。如果沒有選中文字則拋出TclError異常

1.6.sel.last

索引對應(yīng)選中文字的最后一個字符。如果沒有選中文字則拋出TclError異常

2.canvasx(screenx, gridspacing=None)/canvasy(screeny, gridspacing=None)

將窗口坐標系的坐標screenx/canvas轉(zhuǎn)換為畫布坐標系的坐標

gridspacing——畫布坐標將四舍五入到該值的最近倍數(shù)

3.coords(tagOrId, x0, y0, x1, y1, ..., xn, yn)

# 實際函數(shù)定義:dchars(*args)

只傳參tagOrId,則返回tagOrId中唯一一個或顯示列表中第一個畫布對象的坐標的元組,坐標數(shù)量取決于畫布對象的類型

如果傳入新的坐標,則以這個新的坐標移動畫布對象

4.dchars(tagOrId, first=0, last=first)

# 實際函數(shù)定義:dchars(*args)

刪除tagOrId中每個畫布對象閉區(qū)間[first, last]的字符或坐標,對于不支持索引操作的畫布對象會忽略該操作

5.index(tagOrId, index)

# 實際函數(shù)定義:index(*args)

返回在tagOrId中唯一一個或顯示列表中第一個適用的畫布對象的index對應(yīng)的數(shù)字索引

6.insert(tagOrId, index, string)

# 實際函數(shù)定義:insert(*args)

將string插入tagOrId每個畫布對象對應(yīng)index處

當(dāng)string是有效的坐標序列(包括用空格分隔x, y對的字符串、列表、元組等)時,才會將string代表的坐標序列插入線條和多邊形畫布對象

7.delete(*tagOrId)

刪除tagOrId中一個或多個畫布對象。tagOrId不存在不會拋出異常

示例:


運行結(jié)果:

[50.0, 50.0, 100.0, 100.0]

運行時:


點擊兩次“延長線條”后:


?

點擊“刪除所有畫布對象”后:


?

8.icursor(tagOrId, index)

# 實際函數(shù)定義:icursor(*args)

將tagOrId中的畫布對象的插入光標設(shè)置為index。對于不支持插入光標的畫布對象沒有影響

# 插入光標只在畫布對象有焦點時才會被顯示

9.focus(tagOrId=None)

# 實際函數(shù)定義:focus(*args)

將焦點移到tagOrId中唯一一個或顯示列表中第一個適用的畫布對象。

如果tagOrId中沒有支持插入光標的畫布對象,則焦點不會被改變

如果tagOrId是空字符串,則焦點將被重置

如果tagOrId沒有被指定,則返回當(dāng)前擁有焦點的畫布對象的ID,如果沒有畫布對象焦點則返回空字符串

10.type(tagOrId)

返回tagOrId中唯一一個或顯示列表中第一個畫布對象的類型

返回值將是'arc', 'bitmap', 'image', 'line', 'oval', 'polygon', 'rectangle', 'text'或'window'中的一個字符串

11.itemcget(tagOrId, option)

以字符串形式返回tagOrId中唯一一個或顯示列表中第一個畫布對象的屬性項option的值

12.itemconfigure(tagOrId, cnf=None, **kw)

# 別名:itemconfig

與控件的configure()相似,這里是修改tagOrId中唯一一個或顯示列表中第一個畫布對象的屬性項


13.move(tagOrId, xAmount, yAmount)

# 實際函數(shù)定義:move(*args)

移動tagOrId中一個或多個畫布對象,將xAmount添加到它們的x坐標,將yAmount添加到它們的y坐標

14.moveto(tagOrId, x='', y='')

移動tagOrId中一個或多個畫布對象到(x, y)。tagOrId中一個或顯示列表的第一個畫布對象的邊界框(矩形區(qū)域)的左上角移動到(x, y),其他坐標(包括所有tagOrId中的畫布對象)都移動到這個畫布對象的相應(yīng)位置

15.scale(tagOrId, xOffset, yOffset, xScale, yScale)

# 實際函數(shù)定義:scale(*args)

縮放tagOrId中一個或多個畫布對象。其中,縮放的原點是(xOffset, yOffset),xScale和yScale分別確定了x坐標和y坐標的縮放系數(shù)(1.0意味著坐標沒有變化)

有些畫布對象只有一對坐標,使用該方法只會使它們移動

# 將畫布對象的每個坐標點移動,移動后與縮放原點的x和y距離分別乘以xScale和yScale。類似于位似

示例:


運行結(jié)果:

運行時:

按下第二個按鈕幾次后,會發(fā)現(xiàn)整個圖形向右下移動一個像素。然后按下第三個按鈕,圖形會還原

按下第一個按鈕后:

# 這時再按下第三個按鈕,三角形的邊界框左上角會移動到(10, 10),線條坐標與三角坐標對應(yīng)著改變

16.postscript(cnf={}, **kw)

將部分或全部畫布內(nèi)容封裝成PostScript語言

# PostScript語言是一種頁面描述語言,這里不過多介紹

以下是部分屬性項:

16.1.colormode

指定顏色輸出模式

'color'是彩色輸出;'gray'是灰度輸出;'mono'是黑白輸出

16.2.file

如果被選定,則將PostScript寫入到file的文件中,否則將以字符串形式返回PostScript

16.3.rotate

如果值為False(默認值),頁面將為縱向,否則將為橫向(逆時針旋轉(zhuǎn)90°)

16.4.x, y

打印區(qū)域最左邊和最上面的畫布坐標

16.5.width, height

打印區(qū)域的寬度和高度。默認是畫布的可見寬度和高度


17.dtag(tagOrId, tagToDelete)

# 實際函數(shù)定義:dtag(*args)

刪除tagOrId指定的一個或多個畫布對象的標簽tagToDelete

18.gettags(*args)

返回tagOrId指定的一個或顯示列表的第一個畫布對象的所有標簽,返回值是一個元組

19.addtag(*args)

將標簽newtag添加到畫布對象,第一個參數(shù)指定模式(見下面的方法名),后面參數(shù)是對應(yīng)方法的參數(shù)

20.addtag_withtag(newtag, tagOrId)

將標簽newtag添加到tagOrId指定的一個或多個畫布對象

21.addtag_all(newtag)

將標簽newtag添加到畫布上的所有畫布對象

22.addtag_above(newtag, tagOrId)

將標簽newtag添加到在顯示列表中tagOrId指定的一個或顯示列表的最后一個畫布對象之后的畫布對象(之后畫布對象位于tagOrId中畫布對象的上方)

23.addtag_below(newtag, tagOrId)

將標簽newtag添加到在顯示列表中tagOrId指定的一個或顯示列表的第一個畫布對象之前的畫布對象(之前畫布對象位于tagOrId中畫布對象的下方)

24.addtag_closest(newtag, x, y, halo=None, start=None)

將標簽newtag添加到離(x, y)最近的畫布對象(如果重疊則選擇最上面的)

halo——指定增加點的有效尺寸

# 例如值為5則離點(x, y)5個像素內(nèi)的畫布對象視為重疊

start——值為tagOrId,將會在重疊選擇時,優(yōu)先選擇處于tagOrId中一個或顯示列表第一個畫布對象下方的畫布對象,如果下方的畫布對象不在重疊的畫布對象中則再從顯示列表最后向最前選擇

25.addtag_enclosed(newtag, x1, y1, x2, y2)

將標簽newtag添加到完全在矩形內(nèi)的所有畫布對象,(x1, y1)和(x2, y2)分別是矩形左上角和右上角

26.addtag_overlapping(newtag, x1, y1, x2, y2)

將標簽newtag添加到矩形內(nèi)的畫布對象(畫布對象有一點在矩形內(nèi)就被選中),(x1, y1)和(x2, y2)分別是矩形左上角和右上角

示例:


運行結(jié)果:

id1: ('a', 'b', 'd', 'i')

id2: ('b', 'i')

id3: ('b', 'c', 'g', 'i')

id4: ('b', 'e', 'i')

id5: ('b', 'f', 'i')

?


27.tag_lower(tagOrId, belowThis)

# 實際函數(shù)定義:tag_lower(*args)或tag_lower(__first, __second)

# 別名:lower

將tagOrId指定的一個或多個畫布對象在顯示列表中的位置移動到belowThis之前(在belowThis的下方)

belowThis——是一個標簽或ID,如果包括一個以上的畫布對象則是顯示列表中第一個

28.tag_raise(tagOrId, aboveThis)

# 實際函數(shù)定義:tag_raise(*args)或tag_raise(__first, __second)

# 別名:tkraise

將tagOrId指定的一個或多個畫布對象在顯示列表中的位置移動到aboveThis之后(在aboveThis的上方)

aboveThis——是一個標簽或ID,如果包括一個以上的畫布對象則是顯示列表中最后一個

29.tag_bind(tagOrId, sequence=None, func=None, add=None)

同控件方法bind()。標簽可指定多個畫布對象

注意使用標簽進行綁定,在標簽移除后綁定還將繼續(xù)存在于畫布對象,在新的畫布對象添加標簽也不會使綁定應(yīng)用到新的畫布對象上

# 更多信息見章節(jié)“事件處理”

30.tag_unbind(tagOrId, sequence, funcid=None)

同控件方法unbind()。標簽可指定多個畫布對象

# 更多信息見章節(jié)“事件處理”


31.create_arc(*args, **kw)

32.create_bitmap(*args, **kw)

33.create_image(*args, **kw)

34.create_line(*args, **kw)

35.create_oval(*args, **kw)

36.create_polygon(*args, **kw)

37.create_rectangle(*args, **kw)

38.create_text(*args, **kw)

39.create_window(*args, **kw)

見前文相應(yīng)內(nèi)容

40.find(*args)

返回畫布對象ID組成的元組,如果有多個畫布對象按顯示列表順序排序。第一個參數(shù)指定模式(見下面的方法名),后面參數(shù)是對應(yīng)方法的參數(shù)

41.find_above(tagOrId)

42.find_all()

43.find_below(tagOrId)

44.find_closest(x, y, halo=None, start=None)

45.find_enclosed(x1, y1, x2, y2)

46.find_overlapping(x1, y1, x2, y2)

47.find_withtag(tagOrId)

參考addtag_*()中的對應(yīng)方法

48.scan_mark(x, y)

49.scan_dragto(x, y, gain=10)

見章節(jié)“拖拽與縮放功能”

?

# 以下方法中tagOrId參數(shù)需要是文本類型的畫布對象或是顯示列表中第一個文本類型的畫布對象,否則會拋出TclError異常

# 實測一個畫布控件中同時只能有一個畫布對象有選定區(qū)

50.select_item()

返回包含當(dāng)前選定區(qū)的畫布對象ID,沒有則返回None

51.select_adjust(tagOrId, index)

52.select_clear()

53.select_from(tagOrId, index)

54.select_to(tagOrId, index)

見輸入控件的對應(yīng)方法

?

55.bbox(*args)

返回元組(x1, y1, x2, y2)描述傳入畫布對象id(或tag)的矩形邊界

該坐標的坐標系是以畫布坐標系分別向上和左兩像素為原點的坐標系

?

支持XView和YView


二十一、事件處理

(1)、定義

1.事件(event)

事件是發(fā)生在應(yīng)用程序上的事情

# 例如用戶點擊或拖動鼠標,用戶輸入文本及窗口管理器觸發(fā)的重繪事件

2.事件處理(event handler)

事件處理是一個函數(shù),當(dāng)一個事件觸發(fā)時被調(diào)用(回調(diào)函數(shù))

3.綁定(binding)

綁定是為一個控件設(shè)置了事件處理

(2)、綁定等級(Levels of binding)

可以為三個級別設(shè)置事件處理

1.實例級

可以將一個事件綁定到一個特定的控件上

使用控件的bind()方法綁定,使用unbind()方法解綁

2.類級

可以將一個事件綁定到一個類的所有控件上

使用控件的bind_class()方法綁定,使用unbind_class()方法解綁

3.應(yīng)用程序級

可以將一個事件綁定到一個應(yīng)用程序的所有控件上

使用控件的bind_all()方法綁定,使用unbind_all()方法解綁

補充:三個綁定等級中的事件處理是相互獨立的

(3)、事件序列/事件類型/序列碼(Event sequences)

事件序列可以準確地定義事件

一般事件序列是一個包含一個或多個事件模式(event patterns),事件模式之間可以留空格,當(dāng)事件模式按順序執(zhí)行后就會觸發(fā)事件,事件模式有以下三種形式

# 三種形式可以混合使用,例如'a <Button-1> b'事件序列會在順序按下a、鼠標左鍵、b觸發(fā)

1.形式1

一個單一的ASCII字符,如a或2(區(qū)分大小寫),但不能是空格字符或字符'<'

該形式代表對應(yīng)字符的被按下的事件

2.形式2

<[modifier-]...type[-detail]>

整個事件模式被包含在尖括號<>內(nèi),修飾符、事件類型、描述用減號-隔開

modifier——在事件類型前面可添加一個或多個修飾符用來描述組合鍵

# 例如雙擊、按下Alt鍵等

type——表示事件的類型

detail——表示具體的按鍵或鼠標按鈕

# 修飾符、事件類型、描述見后文

3.形式3

<<name>>

指定一個用戶定義并命名的虛擬事件

# 虛擬事件見后文


(4)、綁定事件的控件方法

1.bind(sequence=None, func=None, add=None)

為控件綁定一個事件,當(dāng)事件觸發(fā)時執(zhí)行回調(diào)函數(shù)func

sequence——事件序列

add——如果事件序列的事件已經(jīng)被綁定,則該參數(shù)指定func是否附加到上一個函數(shù)之后。如果為True或'+'則附加,如果為False(默認值)或None則將替換原有的所有函數(shù)

無參數(shù)調(diào)用返回當(dāng)前控件所綁定的事件元組

只傳入sequence調(diào)用則返回對應(yīng)事件的綁定腳本

否則返回一個標識符,用于在unbind()使用

2.unbind(sequence, funcid=None)

為控件解綁事件序列sequence定義的事件

funcid——值應(yīng)是綁定事件時返回的標識符,如果傳入,則只會刪除事件中標識符對應(yīng)的回調(diào)函數(shù),否則刪除事件中的所有回調(diào)函數(shù)

3.bind_class(className, sequence=None, func=None, add=None)

4.unbind_class(className, sequence)

分別類似于bind()和unbind()方法,區(qū)別是為className類的所有控件綁定或解綁事件

# 使用控件的winfo_class()方法獲取類名

5.bind_all(sequence=None, func=None, add=None)

6.unbind_all(sequence, funcid=None)

分別類似于bind()和unbind()方法,區(qū)別是為應(yīng)用程序的所有控件綁定或解綁事件

7.bindtags(tagList=None)

當(dāng)為控件綁定事件時,控件會與一個特定的窗口、一個類名、關(guān)鍵字all或任何其他字符串相關(guān)聯(lián)。這些字符串統(tǒng)稱為綁定標簽

每個控件包含一個綁定標簽的列表,當(dāng)控件發(fā)生事件時,會依次被應(yīng)用到每個標簽

默認情況每個控件有4個標簽:控件名、控件類名、控件最近的頂層窗口名,關(guān)鍵字all

# 頂層窗口因為控件名和頂層窗口名重復(fù),它們只有3個標簽

無參數(shù)調(diào)用則以元組形式返回控件的綁定標簽的列表

傳參標簽列表tagList會將控件的標簽列表改變?yōu)閠agList。如果tagList是空列表,則標簽恢復(fù)到默認狀態(tài)

補充:事件觸發(fā)回調(diào)函數(shù)func時會傳入?yún)?shù)Event類的對象(具體見后)

補充:如果bind()中func參數(shù)傳入的是任意字符串,這會使控件原來綁定的事件失去作用??梢允褂胾nbind()取消

(5)、事件類型和描述

1.Activate, Deactivate

分別在頂層窗口從非活動狀態(tài)變?yōu)榛顒訝顟B(tài)和活動狀態(tài)變?yōu)榉腔顒訝顟B(tài)時會觸發(fā)事件

# 實測用pywin32模塊設(shè)置活動窗口但從沒有觸發(fā)過(可能是方法不對)

2.ButtonPress(縮寫B(tài)utton), ButtonRelease

分別在用戶按下和釋放鼠標按鈕時觸發(fā)事件

描述——1為鼠標左鍵;2為鼠標中鍵;3為鼠標右鍵。對于Linux還支持4和5,分別是鼠標滾輪向上和向下滾動

# 如果沒有設(shè)置描述則按下或釋放鼠標任何按鈕都會觸發(fā)事件

# 如果描述是1, 2, 3, 4或5,則事件類型可以省略,這樣的形式事件類型默認是ButtonPress。例如<2>等價于<ButtonPress-2>或<Button-2>

3.Motion

在用戶在控件內(nèi)移動光標時觸發(fā)事件

4.MouseWheel

在用戶滾動鼠標滾輪時觸發(fā)事件

# 這在Windows和MacOS上有效,但在Linux上無效

5.KeyPress(縮寫Key), KeyRelease

分別在用戶按下或釋放按鍵時觸發(fā)事件

描述——描述是具體的按鍵名,下面有一些例子

# 全部按鍵及keysym_num見https://tcl.tk/man/tcl8.6/TkCmd/keysyms.htm

[a-z][A-Z][0-9]及標點符號:相應(yīng)的按鍵。注意數(shù)字和標點符號也包括小鍵盤

# 標點符號實際有對應(yīng)的表示(keysym),例如"的表示是quotedbl

F[1-36]:相應(yīng)的F*按鍵

Shift_L/Shift_R:左邊和右邊的Shift按鍵

Control_L/Control_R:左邊和右邊的Control按鍵

Alt_L/Alt_R:左邊和右邊的Alt按鍵

Up/Down/Left/Right:上/下/左/右箭頭按鍵

Escape:Esc按鍵

Tab:Tab按鍵

Caps_Lock:Caps Lock(大寫字母鎖定)按鍵

space:space(空格)按鍵

BackSpace:BackSpace(退格)按鍵

Return:Enter(回車)按鍵

Insert/Delete/Home/End:相應(yīng)功能按鍵

Prior/Next:Page Up按鍵和Page Down按鍵

Scroll_Lock:Scroll Lock(滾動鎖定)按鍵

Pause:Pause按鍵

Num_Lock:Num_Lock(數(shù)字鎖定)按鍵

less, greater:'<'和'>'按鍵

# 實測KP_*的按鍵無效果)

# 如果描述是1-5, '<', '>'和空格之外的單個字符或keysym,則事件類型可以省略,這樣的形式事件類型默認是KeyPress。例如<">等價于<KeyPress-">或<Key-">

# 實測如果焦點不在綁定事件的控件上,則不會觸發(fā)該事件

6.Enter, Leave

分別在用戶將光標移動到和移出控件內(nèi)時觸發(fā)事件

# 實測對控件的子控件也有效果

7.Map, Unmap

分別在控件被映射(可見)和取消映射(不可見)時觸發(fā)按鍵

8.FocusIn, FocusOut

分別在控件獲得焦點和失去焦點時觸發(fā)事件

9.Configure

在控件大小、位置或邊框?qū)挾雀淖儠r觸發(fā)事件

10.Destroy

在控件被銷毀時觸發(fā)事件

11.Expose

在窗口全部或部分被重新繪制時觸發(fā)事件

12.Visibility

在控件在屏幕上重新可見時觸發(fā)

# 例如在控件包裝時、窗口由最小化重新顯示時。窗口最大化和取消最大化時實測也會觸發(fā)

示例:


運行結(jié)果:

函數(shù)標識符: 4693952<lambda>

按鈕控件綁定事件:()

按鈕控件類綁定事件:('<ButtonRelease-1>', '<Button-1>', '<Leave>', '<Enter>', '<<Invoke>>', '<Key-space>')

運行時:


按下標簽控件時:


輸入rootquit再按回車后:

運行結(jié)束

(6)、修飾符

1.Control

當(dāng)用戶按住Control鍵

2.Alt

當(dāng)用戶按住Alt鍵

3.Shift

當(dāng)用戶按住Shift鍵

4.Lock

當(dāng)用戶處于大寫鎖定狀態(tài)

5.Buttonk/Bk(k為1~5)

當(dāng)用戶按住相應(yīng)鼠標按鍵(k見事件類型ButtonPress的描述)

6.Double, Triple, Quadruple

當(dāng)用戶連續(xù)觸發(fā)2/3/4次事件

# 與連續(xù)兩個事件序列不同,連續(xù)觸發(fā)需要時間接近,且中間沒有大量的鼠標移動。例如<Button-1><Button-1>沒有時間和空間的要求

7.Metak/Mk(k為1~5或空)

當(dāng)用戶按住鍵盤上相應(yīng)的Meta鍵

# 不同系統(tǒng)鍵盤Meta鍵不同

8.Extended

當(dāng)用戶按住“擴展鍵盤”上的按鍵

(7)、事件處理:Event對象

在事件觸發(fā)時,會傳遞一個描述發(fā)生什么事件的Event類的對象,可以為這個對象編寫對應(yīng)的處理程序(函數(shù)或方法)

1.Event對象的屬性

一些屬性總被設(shè)置,一些屬性只針對特定事件類型被設(shè)置

1.1..char

如果事件與一個ASCII字符的鍵按下或釋放有關(guān),則會設(shè)置該屬性為該字符

1.2..delta

針對MouseWheel事件,屬性值是一個整數(shù),正數(shù)代表向上滾動,負數(shù)代表向下滾動

在Windows下,屬性值是120的倍數(shù);在MacOS下,屬性值是1的倍數(shù)

1.3..width, .height

針對Configure事件,屬性值是控件的新寬度/新高度,單位是像素

1.4..keycode

針對KeyPress或KeyRelease事件,屬性值是一個數(shù)字代碼用于識別按鍵

# 實測大小寫字符的keycode相同,小鍵盤數(shù)字和頂部數(shù)字keycode不同

1.5..keysym

針對KeyPress或KeyRelease事件,屬性值是按鍵對應(yīng)的字符串名

1.6..keysym_num

針對KeyPress或KeyRelease事件,屬性值是按鍵的數(shù)字形式。對應(yīng)常規(guī)單個按鍵是它對應(yīng)的ASCII碼的整數(shù)值

# 全部按鍵的keysym_num見https://tcl.tk/man/tcl8.6/TkCmd/keysyms.htm

1.7..num

針對ButtonPress或ButtonRelease事件,屬性值是對應(yīng)的鼠標按鍵

1.8..serial

整數(shù)形式的序列號,會在服務(wù)器處理客戶請求時增長。值越小代表事件發(fā)生越早

# 實測一些事件多次觸發(fā)serial可能不變,但不會減少

1.9..state

一個描述modifier狀態(tài)的整數(shù)

1.10..time

一個每毫秒都會遞增的屬性值,可以使用該屬性確定兩次事件之間的時間長度

1.11..type

一個描述事件類型的數(shù)字代碼

1.12..widget

引起事件的控件

1.13..x, .y

事件發(fā)生時相對于控件左上角的鼠標X坐標和Y坐標

1.14..x_root, .y_root

事件發(fā)生時相對于屏幕左上角的鼠標X坐標和Y坐標

示例:

運行結(jié)果:

鼠標在畫布上移動時:

(8)、虛擬事件

可以創(chuàng)建自己的新類型的事件——虛擬事件

虛擬事件可以是任何名稱,它被<<...>>括起來

使用下列控件方法創(chuàng)建和管理虛擬事件

1.event_add(virtual, *sequences)

創(chuàng)建一個虛擬事件。如果虛擬事件已存在則將追加事件序列

virtual——虛擬事件的名稱,是被<<...>>括起來的字符串

sequences——一個或多個事件序列。當(dāng)任何一個事件序列觸發(fā)時會觸發(fā)虛擬事件

2.event_delete(virtual, *sequences)

刪除虛擬事件virtual的事件序列sequences。如果sequences沒給出則刪除所有事件序列

3.event_generate(sequence, **kw)

觸發(fā)事件序列sequence描述的事件

kw——通過鍵值對指定事件對象相應(yīng)字段的值

# 事件對象的所有字段見https://tcl.tk/man/tcl8.6/TkCmd/event.htm中EVENT FIELDS

4.event_info(virtual=None)

無參數(shù)調(diào)用返回當(dāng)前定義的所有虛擬事件組成的元組

傳入virtual調(diào)用返回該虛擬事件的事件序列組成的元組

補充:預(yù)定虛擬事件

Tk中有一些預(yù)定的虛擬事件

如:

<<Undo>>撤銷:('<Control-Key-z>', '<Control-Lock-Key-Z>')

<<Copy>>復(fù)制:('<Control-Key-c>', '<Control-Key-Insert>', '<Control-Lock-Key-C>')

一些特定控件有一些特定的虛擬控件,例如列表框被選中時觸發(fā)<<ListboxSelect>>虛擬事件

更多預(yù)定虛擬事件見https://tcl.tk/man/tcl8.6/TkCmd/event.htm

示例:


運行結(jié)果:

('<Button>', '<Key>')

按下一些按鍵再按按鍵輸出:

37 17

0 20

6 19

1 1??# 按鈕觸發(fā)的事件


二十二、控件內(nèi)視圖拖拽功能

參考:https://www.jianshu.com/p/4e77be43ac60?utm_campaign=haruki

# 注意這里的拖拽不是將程序外的文件拖拽到程序內(nèi),而是在拖拽控件視圖

(1)、方法

一些控件(如Entry, Listbox, Canvas)擁有scan_mark()和scan_dragto()方法,使用這些方法實現(xiàn)對控件的掃描和調(diào)整視圖

# 以下方法是Canvas中的,不同控件中同名方法參數(shù)有區(qū)別,但功能一致

1.scan_mark(x, y)

使用該方法實現(xiàn)對畫布的掃描,它會記錄x, y坐標和畫布的當(dāng)前視圖

該方法需要與scan_dragto()一起使用

2.scan_dragto(x, y, gain=10)

該方法會計算x, y坐標與最后一次使用scan_mark(x, y)掃描之間的差調(diào)整視圖,gain指定調(diào)整視圖的增值

畫布視圖最后會被拖拽到如下位置:

# x0, y0是上次掃描位置,x1, y1是傳入?yún)?shù)

(x0 + gain * (x1 - x0), y0 + gain * (y1 - y0))

(2)、拖拽

使用scan_mark()和scan_dragto()方法和bind()方法可實現(xiàn)拖拽功能。具體是將<Button-1>事件的坐標傳入scan_mark(),再將<B1-Motion>事件的坐標傳入scan_dragto()

示例:


運行結(jié)果:

# 正方形可以拖拽(實際上是移動了在畫布中的視圖,藍色正方形在畫布內(nèi)坐標始終不變)


?

補充:畫布的縮放功能

使用畫布的scale()方法可以實現(xiàn)畫布的縮放功能。具體是將<MouseWheel>事件(Linux上是Button-4和Button-5)的坐標確定為縮放原點,再指定縮放系數(shù),縮放的畫布對象是'all'

因為事件的坐標是窗口坐標系,所以需要將窗口坐標系轉(zhuǎn)換為畫布坐標系

因為縮放后畫布對象會變大(或變小),所以需要對應(yīng)的調(diào)整scrollregion(使其等于bbox('all')方法返回值)

示例:


運行結(jié)果:

# 文字縮放只是位置移動


?

補充:畫布對象的拖拽功能

scan_mark()和scan_dragto()方法只是對控件視圖的移動,如果想要在畫布中拖拽畫布對象,可以使用畫布的move()方法

具體操作是:

在<Button-1>事件中記錄點擊畫布對象的x和y坐標

在<B1-Motion>事件中計算偏移的x和y坐標(移動后的x和y坐標分別減去記錄的x和y坐標),并將移動后的x和y坐標覆蓋記錄。之后使用move()方法將畫布對象移動

示例:


運行結(jié)果:

?


補充:tkinter包內(nèi)模塊dnd

用于實現(xiàn)控件拖拽移動功能。但其文檔中寫到這個模塊是實驗性的,后期會被代替


二十三、屬性項數(shù)據(jù)庫

# 參考:

https://tkdocs.com/shipman/option-database.html

https://tcl.tk/man/tcl8.6/TkCmd/option.htm

(1)、概念

屬性項數(shù)據(jù)庫(Option database)用來設(shè)置控件默認的屬性項值

(2)、添加方法

1.使用控件方法option_add()直接為一類控件指定默認值

2.使用控件方法option_readfile()指定一個文件

(3)、pattern格式

在兩種添加方法中都需要使用pattern格式:

由一連串由句號'.'或星號'*'的字符組成,在開頭可選加一個星號'*'

pattern中大寫的一串字符表示一個控件類或一個屬性項名,小寫的一串字符表示一個控件或一個屬性項名

pattern中的最后一串字符總是表示屬性項,前面幾串字符表示查找的控件

pattern中兩串字符之間的句號表示后一串字符是前一串字符的子控件(或?qū)傩裕?,之間的星號表示兩串字符在整個控件層級結(jié)構(gòu)中關(guān)聯(lián)

pattern前加星號,則pattern中的第一串字符適用整個控件層級結(jié)構(gòu);否則,pattern中的第一串字符代表主窗口的名稱(或類名)

# 主窗口的名稱(或類名)是在實例化Tk類傳入的className參數(shù)。名稱默認首字母小寫,類名默認首字母大小,即使傳入名稱的首字母是大寫/小寫

# 實測屬性項名不能使用縮寫

(4)、在程序啟動后添加屬性項數(shù)據(jù)庫

option_add(pattern, value, priority=None)

將pattern格式指定的屬性項的默認值指定為value,添加到屬性項數(shù)據(jù)庫中

priority——指定優(yōu)先級,可以用0到100之間的整數(shù)(一般不建議)或以下值指定:

'widgetDefault':優(yōu)先級20,控件默認值。使用硬編碼進控件的默認值

'startupFile':優(yōu)先級40,特定應(yīng)用程序的默認值

'userDefault':優(yōu)先級60,用戶文件的默認值,例如.Xdefaults文件

'interactive':優(yōu)先級80,程序啟動后設(shè)置屬性項的默認值。未指定priority參數(shù),option_add()和option_readfile()方法的默認優(yōu)先級

(5)、通過指定文件添加屬性項數(shù)據(jù)庫

option_readfile(fileName, priority=None)

將fileName對應(yīng)文件中的屬性項默認值添加到屬性項數(shù)據(jù)庫,priority指定優(yōu)先級

文件不存在或格式無效則引發(fā)TclError異常

文件格式同.Xdefaults文件:

pattern格式: 值

# 注意文件的最后一行需要為空行

示例:

在與.py文件同級目錄新建文件options.txt:

*Label.background: lawn green

*Label.foreground: maroon

*Label.text: 默認文本

?

.py文件:

運行結(jié)果:

?

(6)、相同優(yōu)先級屬性項默認值的匹配

當(dāng)同一個控件有兩個或更多相同優(yōu)先級的屬性項數(shù)據(jù)庫中的默認值可以使用,會優(yōu)先選擇最具體的那個,具體規(guī)則是:

·?使用句號分隔比使用星號分隔更具體,例如*Label.font比*Label*font更具體

·?引用實例比引用它的類更具體,例如假設(shè)創(chuàng)建一個名為my_lbl的標簽控件,*my_lbl.font比*Label.font更具體

·?字符串?dāng)?shù)越多越具體,例如*Label.font比*font更具體

·?如果字符串?dāng)?shù)相同,則層級越前的越具體,例如程序名為my_tk,*my_tk*font比*Label*font更具體

# 相同pattern格式的屬性項默認值,后設(shè)置的會覆蓋前面設(shè)置的

(7)、更多方法

1.option_get(name, classname)

獲取調(diào)用控件和類別classname下屬性項數(shù)據(jù)庫中與屬性項name匹配的屬性項默認值

# 沒有找到classname的作用,實測傳入任何值都對返回結(jié)果沒影響

# 但發(fā)現(xiàn)官方介紹屬性項時會有Database Name和Database Class兩個名稱,個人猜測應(yīng)傳入Database Class。(Database Class名稱一般是Database Name名稱首字母大寫。)

2.option_clear()

刪除Tkinter屬性項數(shù)據(jù)庫中的所有屬性項

(8)、自定義名稱

1.自定義名稱控件

在創(chuàng)建控件實例時傳入name參數(shù),控件名稱首字母不能大寫

2.自定義名稱控件類

在創(chuàng)建控件實例時傳入class_參數(shù)(有的控件類沒有),控件類名稱首字母應(yīng)大寫

如果是通過Python類繼承的方式,則只會修改控件名稱的默認值

Python Tk GUI系列筆記(tkinter篇(中)) 第十九章~第二十三章的評論 (共 條)

分享到微博請遵守國家法律
会理县| 文安县| 林周县| 曲靖市| 察隅县| 齐齐哈尔市| 汝阳县| 吴江市| 西峡县| 玉树县| 茶陵县| 原阳县| 舞钢市| 乐山市| 大荔县| 贡嘎县| 乌兰县| 南充市| 乐安县| 武隆县| 镇江市| 阳春市| 沁阳市| 湘乡市| 武乡县| 曲松县| 宜阳县| 河曲县| 城步| 永善县| 八宿县| 肇州县| 桐柏县| 竹北市| 昭苏县| 新野县| 信阳市| 仪陇县| 张家川| 清新县| 琼中|