如何解决是否可以更改 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 举报,一经查实,本站将立刻删除。