python - 禁用 tkinter 键盘快捷键 (2)

标签 python tkinter tk-toolkit

我提议继续 disable tkinter keyboard shortcut 中的讨论: 我有一个 Tkinter 也使用的事件的事件处理程序,所以我的程序和 Tkinter 交互很糟糕。

由于这是一个我一直无法解决的问题,所以我在这里重新提出,我试图将其归结为以下代码中最简单的形式:

#!/usr/bin/env python

from Tkinter import *
import tkFont

def init():
    global root,text

    root = Tk()
    root.geometry("500x500+0+0")
    dFont=tkFont.Font(family="Arial", size=10)

    text=Text(root, width=16, height=5, font=dFont)
    text.pack(side=LEFT, fill=BOTH, expand = YES)

    root.bind("<Control-b>", setbold)

    text.tag_config("b",font=('Verdana', '10', 'bold' ))
    text.tag_config("i",font=('Verdana', '10', 'italic' ))

def removeformat(event=None):
    text.tag_remove('b',SEL_FIRST,SEL_LAST)
    text.tag_remove('i',SEL_FIRST,SEL_LAST)

def setbold(event=None):
    removeformat()
    text.tag_add('b', SEL_FIRST,SEL_LAST)
    text.edit_modified(True)

def main():
    init()        
    mainloop()


if __name__ == '__main__':
    main()

它应该做的只是生成一个文本窗口,您可以在其中写入。 选择一些文本并按 Ctrl+B 程序应该删除任何预先存在的标签,然后为其分配将文本设置为粗体的“b”标签。

相反发生的是第一个 tag_remove 的异常,它告诉我 text 不包含任何用“sel”标记的字符

使用 return 'break' 的建议是没有用的,因为在 setbold() 有任何机会行动之前选择就消失了...

最佳答案

在文本小部件上设置绑定(bind),而不是在根上。 (整个顶层绑定(bind)在小部件类绑定(bind)之后处理——其中标准 <Control-Key-b> 绑定(bind)是——并且那些在小部件实例绑定(bind)之后处理,这就是你想要的在这里使用。)你需要这样做'break' ;它会抑制后续绑定(bind)。 (如果您在此之后遇到任何问题,可能是默认焦点错误,但这很容易修复。)

唯一的另一种选择是重新配置绑定(bind)标签,以便在顶级绑定(bind)之后处理类绑定(bind),但这样做的后果非常微妙且影响深远;您应该改用我第一段中的更简单的方法,因为这是处理这些事情的正常方法。

关于python - 禁用 tkinter 键盘快捷键 (2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6813219/

相关文章:

python - 为什么 Tkinter Canvas 要求 4 个额外的宽度和高度像素?

tkinter - 如何为 Tk 构建包装器?

python - 在 Tkinter 中滚动一组小部件

python - C++ 中的高效集合并集和交集

python - 如何将滚动条附加到文本小部件?

python - 如何在Python Tkinter中自动或无限次运行特定函数?

python - 关闭 cmd,同时保留 Tk 对象

python - 使用 bool 掩码合并两个Python列表

python - Pandas 数据框 : select multiple rows based on entries in other rows

python - 如何在巨大的数据集中查找和转换 pandas 数据框中的缺失值?