Tkinter(Python):如何将修改后的点击视为仅点击

时间:2018-06-29 18:39:36

标签: python-2.7 tkinter event-handling

当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上运行。)

编辑:我要实现的目标是:

  1. 用户点击次数:默认行为
  2. 用户点击并按住Shift键:忽略Shift键,默认为点击行为
  3. 用户点击和控制点击:控件被忽略,默认的点击行为
  4. 用户点击和替代点击:忽略替代,点击的默认行为
  5. (您明白了)

即有什么方法可以让Tkinter忽略修饰符?

1 个答案:

答案 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()