当前位置: 首页 > 知识库问答 >
问题:

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

太叔飞翰
2023-03-14

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

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

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()

共有3个答案

姜嘉赐
2023-03-14

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

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

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

韩夕
2023-03-14

您遇到这种情况是因为绑定事件是在bindtags事件之前处理的,换句话说,您实际上没有将回调函数之前的选项卡更改为"

一种解决方法是旋转处理事件的顺序。在之后添加note.bind(...)

note.bindtags((note.bindtags()[1:] + note.bindtags()[:1]))

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

另一种方法是替换实际事件(

长孙泉
2023-03-14

发生这种情况的原因是事件处理的顺序。小部件上的自定义绑定在内置绑定之前处理,这意味着您在上的绑定

更好的解决方案是绑定虚拟事件

示例:

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

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

 类似资料:
  • 8.2.4.更新选项菜单的事件处理 要捕获新条目的点击事件,我们需要更新StatusActivity中的onOptionsItemSelected()方法,这跟我们在"更新StatusActivity,装载菜单"一节中所做的一样。打开 StatusActivity.java 文件,找到onOptionsItemSelected方法。现在里边已经有了为不同条目提供支持的大体框架,要增加两个“启动 S

  • 我想处理一个选择菜单的测试场景,其中 spec 将选择一个随机选项,而不是当前选择的选项。我似乎找不到一个有效的定位器或方法可以让我做到这一点。 策略1:获取的当前索引,并从其他索引中随机选择 策略2:获取-获取数组的长度并选择随机数组。此选择器似乎忽略了部分,并返回选项总数 由于我对量角器很陌生,我真的没有看到一种方法来查看API。请问有什么提示吗?

  • 我们有几个域对象具有可为空的字段。我们已经读到hibernate需要“raw”对象来正确映射它,所以我们的getter返回optionals。我们的域对象如下所示: 但现在我们在解决/绑定这些字段时遇到了问题。jspx文件。(显示和表单输入字段。)对于基本类型和字符串,我们可以通过定义自定义OptionalToStringConverter绕过这一点。 对其他域对象的可空引用仍然是一个问题。 我们

  • 我在选择元素的更改事件上绑定了一个事件: 当变更事件发生时,我如何访问被选中的元素?

  • 问题内容: 我有这样的选项菜单: 现在,我想使用href更改选定的选项。例如: 但是我想用而不是选择选项。 如何更改此代码? 问题答案: 更改 至

  • 问题内容: 我的目标是在浏览器选项卡关闭时删除用户cookie。 可能吗?我可以在没有刷新情况下处理浏览器选项卡关闭事件吗? 如果我使用或事件,则当用户刷新页面时会触发函数,我不希望这样,我只想在关闭选项卡时运行。 如何在Angular中做到这一点? 问题答案: 可悲的是,这不是一个简单的问题要解决。但这是可以完成的。以下答案是由许多不同的SO答案合并而成的。 简单的部分: 知道该窗口已被破坏。您