python-2.7 - Python Tkinter - 恢复原始默认键绑定(bind)

标签 python-2.7 tkinter event-binding

我在 Win7 机器上使用 Python 2.7 和 Tkinter GUI。

在某些情况下,我想完全覆盖 Tab 键的正常默认行为,但前提是存在某些条件。之后我想恢复到默认行为。 (请注意,目前我对 Tab 键很感兴趣,但在某些时候我可能也需要对其他键执行此操作。)

下面的代码片段(不是我的实际应用程序,只是一个精简的示例)为我提供了我想要的完全覆盖,但它具有“永久”消除默认行为的副作用,一旦我执行了 解除绑定(bind),使Tab键失效:

import Tkinter as tk

#Root window
root = tk.Tk()

tabBlock = ''

#Tab override handler
def overrideTab(*args):
    global tabBlock
    if (ctrlChk4.get()==1):
        tabBlock = root.bind_all('<Tab>',stopTab)
    else:
        root.unbind('<Tab>',tabBlock)

def stopTab(*args):
    print 'Tab is overridden'

#Control variable
ctrlChk4 = tk.IntVar()
ctrlChk4.trace('w',overrideTab)

#GUI widgets
fra1  = tk.Frame(root)
chk1 = tk.Checkbutton(fra1,
                      text='First checkbutton')
chk2 = tk.Checkbutton(fra1,
                      text='Second checkbutton')
chk3 = tk.Checkbutton(fra1,
                      text='Third checkbutton')
chk4 = tk.Checkbutton(fra1,
                      text='Tab override',
                      variable=ctrlChk4)

fra1.grid(row=0,column=0,sticky=tk.W,padx=10,pady=10)
chk1.grid(row=0,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk2.grid(row=1,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk3.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk4.grid(row=3,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))

tk.mainloop()

我已经尝试过执行 bind 而不是 bind_all 的变体,并将绑定(bind)方法的 add 参数设置为 1'+'。这些变体都给我相同的结果:它们让我在执行 unbind 后恢复默认行为,但它们也允许在 bind 时继续默认行为效果。

我搜索了各种在线资源以寻找一种方法来“保存和恢复”原始绑定(bind),或者“非破坏性地”完全覆盖默认行为,但在这两个方面都没有运气。

有什么方法可以完成我想做的事情吗?

编辑:当谈到 Tab 键时,我知道我可以模仿/替换原来的默认行为

root.focus_get().tk_focusNext().focus_set()

...但这也是一个通用问题。如果我需要在某个模块的上下文中覆盖一个键——任何键——(比如,一个包含我自己的自定义类的我自己的自定义调整的 Tkinter 小部件),但然后恢复到绑定(bind)/行为那个键就像在调用模块中一样,我该怎么做?可能吗?

最佳答案

好的,我试过了,给你一个答案。我在评论中提出的建议有效。总之,返回“break”当你想覆盖它的时候。不要当你不这样做。使用 bind 而不是 bind_all。而且,如果您尚未在 args 中这样做,请考虑事件参数,否则它将无法正常工作。您实际上仍在将某些内容绑定(bind)到 key ,但它只会在某些特定情况下覆盖默认功能。这是代码(适用于 Python 2.x 和 3.x):

import sys
if sys.version_info[0]<3:
    import Tkinter as tk
else:
    import tkinter as tk

#Root window
root = tk.Tk()

#Tab override handler
def overrideTab(*args):
    root.bind('<Tab>', stopTab)

def stopTab(event=None, *args):
    if ctrlChk4.get()==1:
        print('Tab is overridden')
        return "break"
    else:
        print('Tab is not overridden') #Note that it still prints this.

#Control variable
ctrlChk4 = tk.IntVar()
ctrlChk4.trace('w',overrideTab)

#GUI widgets
fra1  = tk.Frame(root)
chk1 = tk.Checkbutton(fra1,
                      text='First checkbutton')
chk2 = tk.Checkbutton(fra1,
                      text='Second checkbutton')
chk3 = tk.Checkbutton(fra1,
                      text='Third checkbutton')
chk4 = tk.Checkbutton(fra1,
                      text='Tab override',
                      variable=ctrlChk4)

fra1.grid(row=0,column=0,sticky=tk.W,padx=10,pady=10)
chk1.grid(row=0,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk2.grid(row=1,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk3.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk4.grid(row=3,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))

tk.mainloop()

关于python-2.7 - Python Tkinter - 恢复原始默认键绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21468106/

相关文章:

python - 返回多个范围的 numpy 数组

json - 在 Django 的加载数据中设置外键

python - 使用 tkinter 创建计时器

python - 在 SQLite3 DELETE 语句中引用 python 变量

模板语句中的 Angular 异步参数

python - 身份验证无法使用pymongo连接到mongodb

python - 导入错误 : cannot import name ExponentialSmoothing

python - 在 matplotlib 中动态更新绘图

angular - 如何使用单击事件从父组件中的子组件刷新我的表格内容?

javascript - 两个 jQuery 选择器有什么区别?