【问题标题】:Tkinter (Python): How to treat a modified click as just a clickTkinter(Python):如何将修改后的点击视为一次点击
【发布时间】:2018-06-29 18:39:36
【问题描述】:

当 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. 用户点和 alt 点击:Alt 被忽略,点击的默认行为
  5. (你懂的)

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

【问题讨论】:

  • 你的问题有点不清楚。您是否希望事件不执行默认行为?或者你是说你想要一个 shift-click 来做一个正常点击的默认行为?
  • 如果您想关闭在该模式下工作的绑定,将selectmode 设置为外部的目的是什么?为什么不将selectmode 设置为单个?
  • @BryanOakley 我试图让任何修改过的点击(shift、control、alt 等)产生与不按住修饰键的简单点击相同的结果。关于selectmode 的选择,有一个很长的背景故事,但 tl;dr 版本是我只是对 GUI 行为的细节不屑一顾。 tk.SINGLE 没有按照我想要的方式做我想做的事。 tk.EXTENDED 更近了,所以我正在尝试调整它。
  • 也许更好的解决方案是描述你真正想要完成的事情。可能有比从扩展模式开始然后开始删除部分实现更好的方法。
  • @BryanOakley 我提出了这个问题,因为它处理了一种更通用的功能,可以有超出我当前特定用例的应用程序——这反过来又会使这个问题在未来对其他人更有用。如果答案是“抱歉,Tkinter 只是不支持您所描述的内容”,那么我会再试一次。

标签: python-2.7 tkinter event-handling


【解决方案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()

【讨论】:

  • 谢谢,这不仅涵盖了我需要的东西,而且意外收获以两种方式得到了回报:(1) 我现在明白绑定回调仅修改正常行为而不是替换它,并且 (2) 阻止这种行为的方法是从回调中返回字符串“break”。
  • @JDM:这不太对。自定义绑定不会修改任何内容。自定义绑定将首先运行,并且可以选择是否禁止默认绑定。原始默认绑定保持不变。有关发生情况的描述,请参阅stackoverflow.com/questions/11541262/…
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2013-04-20
相关资源
最近更新 更多