当Tkinter检测到修改后的点击事件,例如<Shift-Button-1>
,<Control-Button-1>
等时,有一种方法可以“存根”修改键并将其仅作为<Button-1>
处理?
我能想到的唯一方法(对我的用例不起作用)是为各种修饰符创建事件绑定,然后将它们全部指向触发未修改事件的回调。例如,
import Tkinter as tk
root = tk.Tk()
lst = tk.Listbox(root,selectmode=tk.EXTENDED)
[...geometry setup...]
def clickOnly(*args):
lst.event_generate('<Button-1>')
lst.bind('<Shift-Button-1>',clickOnly)
lst.bind('<Control-Button-1>',clickOnly)
[...other related bindings...]
tk.mainloop()
当我运行此代码时,shift-click等将被回调拦截,但是行为结果与纯单击会有所不同。例如。 Shift-click将锚定到索引0处的项目,并且仍然选择多个项目,而不仅仅是单击的项目。
关于如何纠正我的方法的指导会很好,但是我真的希望有人可以向我指出一种不同的,更简洁的方法-一些更直接的方法来将班次,控制权和其他修饰语视为总是假的。
(环境为Python 2.7.x,在Windows 7/10上运行。)
编辑:我要实现的目标是:
即有什么方法可以让Tkinter忽略修饰符?
答案 0 :(得分:1)
最简单的解决方案是创建显式绑定以完全执行所需的操作,然后阻止默认绑定的发生。您可以通过使绑定函数返回字符串“ break”来完成后者。
示例:
import Tkinter as tk
root = tk.Tk()
lst = tk.Listbox(root,selectmode=tk.EXTENDED)
lst.pack()
lst.insert("end", "one", "two", "three", "four", "five")
def clickOnly(event):
index = '@%s,%s' % (event.x, event.y)
event.widget.focus_set()
event.widget.select_clear(0, "end")
event.widget.select_set(index)
event.widget.activate(index)
event.widget.select_anchor(index)
return "break"
lst.bind('<Any-ButtonPress-1>', clickOnly)
tk.mainloop()