繁体   English   中英

是否可以更改 Tk/Tkinter 列表框小部件的绑定顺序 &lt;<listboxselect> &gt; 活动</listboxselect>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM