【发布时间】: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 上运行。)
编辑:我想要实现的是:
- 用户点击:默认行为
- 用户点和 Shift 单击:忽略 Shift,单击的默认行为
- 用户点和控件单击:控件被忽略,单击的默认行为
- 用户点和 alt 点击:Alt 被忽略,点击的默认行为
- (你懂的)
即有什么方法可以让 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