
[英]_tkinter.TclError: bad listbox index "" unwelcome <Listboxselect> event by selecting text in a Entry Widget
[英]Is it possible to alter binding order of a Tk/Tkinter Listbox widget <<ListboxSelect>> event
据我了解,Tk/Tkinter Listbox 小部件的“正常”绑定事件顺序是(简化): <ButtonPress>, <<ListboxSelect>>, <ButtonRelease>
是否可以“更改”顺序以便在<ButtonRelease>
之后触发<<ListboxSelect>>
事件?
为此,我尝试将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>
是“未绑定”的,所以我应该调用/在<ButtonRelease>
回调结束时生成<<ListboxSelect>>
事件以触发它......这可能在大多数情况下都有效,但是......这不是我想要达到的......(确实,这就像将<<ListboxSelect>>
事件代码“移动”到<ButtonRelease>
callbak...)所以,最后,问题是是否可以将 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'
参数,因为我认为在处理默认(“ 'browse'
-select”)列表框时应用这种方法是不值得的。 这是因为,与“'browse'-select”列表框不同,使用“ 'single'
single'-select”列表框元素选择不会“跟随”鼠标直到最后,它会在第一次点击时“卡住”-元素,即使您结束在不同项目上释放鼠标按钮。
我必须说,无论如何,这可能在大多数情况下都不值得,因为你可能只是:
selectmode='single'
参数,保留默认列表框'browse'
-select-behavior;<<ListboxSelect>>
执行的代码“移动”到<ButtonRelease>
上的绑定(当然,这不会涉及代码的 rest 上的太多“扭曲”......)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.