微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以更改 Tk/Tkinter 列表框小部件 <<ListboxSelect>> 事件的绑定顺序

如何解决是否可以更改 Tk/Tkinter 列表框小部件 <<ListboxSelect>> 事件的绑定顺序

据我所知,Tk/Tkinter ListBox 小部件的“正常”绑定事件顺序是(简化):<ButtonPress>,<<ListBoxSelect>>,<ButtonRelease>

是否可以“更改”顺序以便在 <<ListBoxSelect>> 之后触发 <ButtonRelease> 事件?

为此,我尝试将 bindtags自定义“假”bind_class 一起使用,但到目前为止还没有得到想要的结果...... 这是代码示例:

import tkinter as tk

root = tk.Tk()

l = tk.ListBox(root,name='custlist')
for e in range(55): l.insert(tk.END,'L_item'+str(e))
l.pack()

l.bind('<ButtonPress>',lambda e: print("L: Click"))
l.bind('<ButtonRelease>',lambda e: print("L: ButtonRelease"))

l.bind_class("post-class-bindings","<<ListBoxSelect>>",lambda e: print("L: post-ListBoxSelect"))
l.bindtags((l.winfo_pathname(l.winfo_id()),'ListBox','post-class-bindings','.','all'))

你能告诉我是否有可能通过这种方式或其他方式获得这样的东西? 谢谢

编辑:

想到它我意识到我不能那样做,因为我猜 <ButtonPress>+<<ListBoxSelect>> 事件在其流程中有些“连锁”,而 <ButtonRelease> 是“解开”的,所以我应该在 <<ListBoxSelect>> 的末尾调用/生成 <ButtonRelease> 事件回调来触发它......这可能在大多数情况下都有效,但是......这不是我想要到达这里......(实际上,这就像将<<ListBoxSelect>>事件代码“移动”到<ButtonRelease> 回调...) 所以,最后,问题是是否可以将 ButtonRelease 与 ListBoxSelect(与 ButtonPress 的方式相同)“链接”在一起? ...我想这样的事情是不可能的

解决方法

是否可以“更改”顺序以便在该顺序之后触发 <<ListboxSelect>> 事件?

做到这一点的唯一方法是防止选择在单击按钮时发生变化。 <<ListboxSelect>> 不是按钮点击或按钮释放的直接结果,而是选择已更改的直接结果。您不能在单击时更改选择,并且不能生成<<ListboxSelect>>

我不太明白您真正的需求是什么,但是如果您想在按钮释放时收到选择更改的通知,您可以随时在 <ButtonRelease-1> 的处理程序中发出您自己的自定义虚拟事件,例如,<<ListboxSelectAfterClick>>

,

感谢 Bryan Oakley 的澄清,我找到了一个可能的解决方案:

我的主要目的是让元素 列表中的选择仅在释放鼠标按钮后激活/触发。

import tkinter as tk

root = tk.Tk()

l = tk.Listbox(temp,name='custlist',selectmode='single')
for e in range(55): l.insert(tk.END,'L_item'+str(e))
l.pack()

l.bind('<ButtonPress>',lambda e: "break")
def AfterReleaseSelect(event):
    event.widget.selection_clear(0,tk.END)
    event.widget.selection_set(event.widget.nearest(event.y))
    #more stuffs here if needed...
l.bind('<ButtonRelease>',AfterReleaseSelect)

实际上,我在这里所做的是阻止按钮点击来完成它的工作,这样列表框选择就不会被触发,然后等待释放鼠标按钮来做这些事情。

>

对此的一些最终想法:

首先,请注意:我在这里向 Listbox 小部件添加了 selectmode='single' 参数,因为我认为在处理 default ("'browse'-select" ) 列表框。这是因为,与“'browse'-select”列表框不同,使用“'single'-select”列表框元素选择不会“跟随”鼠标直到最后,它会“卡住”在第一个 - clicked-element,即使您在不同的项目上结束释放鼠标按钮。

我必须说,无论如何,这在大多数情况下可能不值得,因为您可能只是:

  • 避免使用 selectmode='single' 参数,使用默认列表框 'browse'-select-behavior;
  • “移动”您将使用绑定 <<ListboxSelect>> 执行的代码到 <ButtonRelease> 上的绑定(只要这不涉及对其余代码进行太多“扭曲”,当然...)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。