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

Python tkinter bindtag事件处理-如何更新当前选定的选项卡,python,tkinter,bind,Python,Tkinter,Bind,我是Python新手,即将使用tkinter构建GUI。GUI由一个笔记本组成,我试图为用户在不同选项卡上单击鼠标时创建一个事件处理程序。但是,当我单击选项卡时,handlerfunction“工作”,但在调用该函数之前,所选选项卡似乎没有“更新” 旁注:到目前为止,我主要使用了“Tkinter 8.5参考:用于 Python(希普曼)。请参阅下面的代码。谢谢你的建议 from tkinter import * import tkinter.ttk as ttk root = Tk() not

我是Python新手,即将使用tkinter构建GUI。GUI由一个笔记本组成,我试图为用户在不同选项卡上单击鼠标时创建一个事件处理程序。但是,当我单击选项卡时,handlerfunction“工作”,但在调用该函数之前,所选选项卡似乎没有“更新”

旁注:到目前为止,我主要使用了“Tkinter 8.5参考:用于 Python(希普曼)。请参阅下面的代码。谢谢你的建议

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()
从tkinter导入*
将tkinter.ttk导入为ttk
root=Tk()
注意=ttk.笔记本(根)
tab1=框架(注,宽度=10)
表2=框架(注,宽度=10)
表3=框架(注,宽度=10)
注.添加(表1,text=“表1”)
注.添加(表2,text=“表2”)
注.添加(tab3,text=“Tab三”)
注:网格()
def个性化数据(事件):
如果event.widget.index(“当前”)==0:
打印(“一个!”)
其他:
打印(“不是一个!”)
注:绑定(“”,个人数据)
root.mainloop()

您之所以会遇到这种情况,是因为,换句话说,您实际上没有在处理回调函数为
事件
personalData
之前更改选项卡


一种解决方法是旋转事件处理顺序。在注释后添加。绑定(…):

这将把绑定的回调作为序列中的最后一个回调,并将其余回调移到队列中的上一个



另一种方法是将实际事件(
)替换为更合适的事件,如。

发生这种情况的原因在于事件的处理顺序。小部件上的自定义绑定在内置绑定之前进行处理,这意味着
上的绑定将在选项卡实际更改之前启动。有关更多信息,请研究“绑定标签”(有时称为“绑定标签”或“绑定标签”)

更好的解决方案是绑定虚拟事件
,笔记本会在选项卡更改后生成虚拟事件

例如:

note.bind("<<NotebookTabChanged>>", personalData)
note.bind(“,personalData)

绑定到虚拟事件而不是鼠标单击的另一个好处是,即使通过鼠标单击以外的其他机制更改了选项卡,也会触发事件。例如,如果某个选项卡具有键盘焦点,您可以使用键盘上的箭头键选择下一个或上一个选项卡。

请注意,当您单击另一个选项卡时,当前选项卡仍然是上一个选项卡;如果您将绑定更改为

note.bind('<ButtonRelease-1>',personalData)
note.bind(“”,personalData)

它可以正常工作,就像现在一样,当松开鼠标按钮时,当前选项卡就是已选择的选项卡。

注意。绑定(“”,personalData)
此解决方案的缺点是,如果用户使用键盘切换选项卡,则无法正常工作(当笔记本选项卡具有键盘焦点时,可以使用左右箭头进行切换)。当然,我同意您对虚拟活动的首选用法。谢谢!对键盘焦点做出反应的可能性是有意义的。谢谢,现在它可以正常工作了!对键盘焦点做出反应的可能性是有意义的。实际上,在问这个问题之前,我写了note.bind(‘(GUI中tkinter的第128页)没有意识到“-”是由于教程中的换行引起的(我太笨了…),但是在运行这段代码时,我没有收到任何错误消息(空闲Shell)这让我很惊讶。@user2423970从技术上讲,
'
是一个有效的虚拟事件标识符。Tkinter无法知道您是否在代码中的其他地方创建了(或计划创建)这样的事件。我不像其他解决方案那样喜欢这种变通方法,但我喜欢这种解释
note.bind('<ButtonRelease-1>',personalData)