我注意到ttk.Checkbuttons小部件中的一個行為。也就是說,任何應用到這個小部件的系結或事件處理程式總是在小部件的command選項方法/函式被執行之前發生。
意義:
鑒于 狀態的改變
ttk.Checkbuttons是由command選項方法/函式執行的,ttk.Checkbuttons['variable']通過事件處理程式訪問的值將始終是舊狀態,而不是由小部件的command選項方法/函式定義的新狀態。ttk.Checkbuttons['variable']在事件處理程式中更改 的值會弄亂小部件的command選項方法/函式的性能。因此,ttk.Checkbuttons['variable']應該在小部件的command選項方法/功能中設定。
問題:
鑒于上述情況,那么將事件處理程式系結到ttk.Checkbuttons小部件的目的是什么?
事件處理程式在事件發生時執行,例如<ButtonRelease-1>在ttk.Checkbutton小部件上發生時。如果我想根據小部件的狀態設計后續操作,我無法通過事件處理程式來實作,因為小部件instate尚未更新。一種解決方法是假設在事件處理程式中獲得的小部件instate與variable報告的instate或 variable.get() 值相反。然而,這樣的做法似乎有些冒昧。
ttk.Checkbutton當狀態發生變化時,我應該如何使用事件處理程式來撰寫后續操作?或者我應該不使用它而只使用小部件command選項方法/功能來設計基于小部件狀態的后續操作?
uj5u.com熱心網友回復:
鑒于上述情況,那么將事件處理程式系結到 ttk.Checkbuttons 小部件的目的是什么?
這樣您就可以定義自己的行為來覆寫默認行為。
當狀態發生變化時,我應該如何使用 ttk.Checkbutton 的事件處理程式來編程后續操作?
一種解決方案是不使用事件處理程式。相反,在關聯的變數上設定跟蹤。使用變數跟蹤,您的回呼函式將在變數設定后呼叫,并且每次值更改時都會呼叫,即使更改是由事件以外的其他操作完成的。
cb_var = tk.StringVar(value="off")
cb = ttk.Checkbutton(root, variable=cb_var, onvalue="on", offvalue="off", text="Ready?")
cb_var.trace_add('write', callback)
另一種解決方案是在類的系結標簽之后創建一個自定義系結標簽。
例子:
cb_var = tk.StringVar(value="off")
cb = ttk.Checkbutton(root, variable=cb_var, onvalue="on", offvalue="off", text="Ready?")
tag = f'custom_{cb}'
cb.bindtags((cb, 'TCheckbutton', '.', tag, 'all'))
cb.bind_class(tag, "<ButtonRelease-1>", callback)
有了上面的內容,<ButtonRelease-1>在小部件類上的默認系結處理該事件后,將在按鈕上呼叫回呼。如果您這樣做,您還應該以類似的方式向空格鍵添加系結,因為您還可以使用空格鍵設定復選按鈕的值。
對于多一點關于它們是如何作業的討論bindtags的另一個例子,看到這個答案的問題如何Tkinter的文本小部件系結自事件發生后,將通過文本控制元件系結?. 另外,看到這個答案的問題關于Tkinter的bindtags基本查詢。
uj5u.com熱心網友回復:
相反,在關聯的變數上設定跟蹤。使用變數跟蹤,您的回呼函式將在變數設定后呼叫,并且每次值更改時都會呼叫,即使更改是由事件以外的其他操作完成的。
我喜歡分享我從將.trace_add()方法應用于 a 的變數ttk.Checkbutton中學到的知識,并為@BryanOakley 提供對我問題的有用答案的見解。
- 方法執行的回呼
.trace_add()將始終在ttk.Checkbutton小部件的命令選項方法/函式之前。 - 另外,如果在widget的命令選項方法/函式
ttk.Checkbutton的執行程序中變數的值發生了變化ttk.Checkbutton,則該.trace_add()方法的回呼將在widget的命令選項方法/函式中途執行。也就是說,在一個完整的流程中,該.trace_add()方法的回呼可以執行兩次。
為了說明以上幾點,下面是我寫的一個測驗代碼的列印陳述句。我有 4ttk.Checkbutton個小部件,分別表示為B1, B2, B3, B4。單擊時,ttk.Checkbutton將切換的選擇/取消選擇。但是,必須始終選擇至少一個 ttk.Checkbutton(即影像格式)。最初,這些按鈕都被選中。接下來,依次單擊這些按鈕以取消選擇它們。該陳述句### Callback ####是從.trace_add()方法的回呼中列印出來的。從### Command Trigger 0 ###to的列印輸出 ### Command Trigger 1 ###發生在ttk.Checkbutton小部件的命令選項方法/函式的開始和結束處。
列印宣告:
# B1 ttk.Checkbutton clicked on
### Callback #### formats = ['B2', 'B3', 'B4']
### Command Trigger 0 ### formats = ('0', 'B2', 'B3', 'B4') 3
cb=.!app.!checkbutton text=B1 variable=B1 Checkbutton variable
nchosen != 0
### Command Trigger 1 ### formats = ('0', 'B2', 'B3', 'B4') 3
# B2 ttk.Checkbutton clicked on
##### Callback #### formats = ['B3', 'B4']
### Command Trigger 0 ### formats = ('0', '0', 'B3', 'B4') 2
cb=.!app.!checkbutton2 text=B2 variable=B2 Checkbutton variable
nchosen != 0
### Command Trigger 1 ### formats = ('0', '0', 'B3', 'B4') 2
# B3 ttk.Checkbutton clicked on
### Callback #### formats = ['B3']
### Command Trigger 0 ### formats = ('0', '0', '0', 'B4') 1
cb=.!app.!checkbutton3 text=B3 variable=B3 Checkbutton variable
nchosen != 0
### Command Trigger 1 ### formats = ('0', '0', '0', 'B4') 1
# B4 ttk.Checkbutton clicked on
### Callback #### formats = []
### Command Trigger 0 ### formats = ('0', '0', '0', '0') 0
cb=.!app.!checkbutton4 text=B4 variable=B4 Checkbutton variable
nchosen == 0
### Callback #### formats = ['B4']
### Command Trigger 1 ### formats = ('0', '0', '0', 'B4') 1
意義:
由于.trace_add()方法的回呼總是先于ttk.Checkbutton小部件的命令選項方法/函式,并且可以ttk.Checkbutton在一個流程中的小部件的命令選項方法/函式的執行期間發生,因此回呼的內容必須預見到這種情況的發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/356576.html
上一篇:按鈕不加
