[英]Python/Tkinter: bind to event related to currently selected menu item
[英]Python tkinter bindtag Event handling - how to update which tab is currently selected
我是Python新手,即將使用tkinter構建GUI。 GUI由一個Notebook組成,我正在嘗試為用戶在不同選項卡上單擊鼠標時創建一個事件處理程序。 但是,當我單擊一個選項卡時,處理程序功能“有效”,但在調用該函數之前,所選選項卡似乎未“更新”。
作為旁注:到目前為止,我主要使用'Tkinter 8.5參考:Python(Shipman)的GUI'。 請參閱下面的代碼。 感謝任何建議!
from tkinter import *
import tkinter.ttk as ttk
root = Tk()
note = ttk.Notebook(root)
tab1 = Frame(note,width = 10)
tab2 = Frame(note,width = 10)
tab3 = Frame(note,width = 10)
note.add(tab1, text = "Tab One")
note.add(tab2, text = "Tab Two")
note.add(tab3, text = "Tab Three")
note.grid()
def personalData(event):
if event.widget.index("current") == 0:
print("One!")
else:
print("Not One!")
note.bind('<1>',personalData)
root.mainloop()
發生這種情況的原因是由於處理事件的順序。 小部件上的自定義綁定在內置綁定之前處理,這意味着在<1>
上的綁定將在選項卡實際更改之前觸發。 有關更多信息,請研究“綁定標記”(或有時稱為“綁定標記”或“綁定標記”)。
更好的解決方案是綁定虛擬事件<<NotebookTabChanged>>
,筆記本將在選項卡更改后生成。
例:
note.bind("<<NotebookTabChanged>>", personalData)
綁定到虛擬事件而不是鼠標單擊的另一個好處是,即使通過鼠標單擊之外的其他一些機制更改了選項卡,事件也會觸發。 例如,如果選項卡具有鍵盤焦點,則可以使用鍵盤上的箭頭鍵選擇下一個或上一個選項卡。
您遇到這種情況是因為bind事件是在bindtags事件之前處理的 ,換句話說,您實際上並沒有在回調函數之前將選項卡更改為"<1>"
事件,處理了personalData
。
一種解決方法是旋轉正在處理事件的序列的順序。 在note.bind(...)
之后添加:
note.bindtags((note.bindtags()[1:] + note.bindtags()[:1]))
這將把bind的回調作為序列中的最后一個,並將其余部分轉移到隊列中。
另一種方法是將實際事件( "<1>"
)替換為更合適的事件,如Novel的建議 。
請注意,當您單擊另一個選項卡時,當前選項卡仍然是上一個選項卡; 如果你改變你的綁定
note.bind('<ButtonRelease-1>',personalData)
它將正常工作,就像現在一樣,當釋放鼠標按鈕時,當前選項卡是已經選中的選項卡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.