繁体   English   中英

Python tkinter bindtag事件处理 - 如何更新当前选择的选项卡

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM