Python 禁用tkinter键盘快捷键(2)
我建议继续中的讨论:对于Tkinter也使用的事件,我有一个事件处理程序,因此我的prog&Tkinter交互不好 因为这是一个我一直无法解决的问题,所以我在这里提出,我试图用以下代码将其归结为最简单的形式:Python 禁用tkinter键盘快捷键(2),python,tkinter,tk,Python,Tkinter,Tk,我建议继续中的讨论:对于Tkinter也使用的事件,我有一个事件处理程序,因此我的prog&Tkinter交互不好 因为这是一个我一直无法解决的问题,所以我在这里提出,我试图用以下代码将其归结为最简单的形式: #!/usr/bin/env python from Tkinter import * import tkFont def init(): global root,text root = Tk() root.geometry("500x500+0+0")
#!/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()
#/usr/bin/env python
从Tkinter进口*
导入tkFont
def init():
全局根,文本
root=Tk()
根几何(“500x500+0+0”)
dFont=tkFont.Font(family=“Arial”,size=10)
text=text(根,宽=16,高=5,字体=dFont)
text.pack(侧边=左侧,填充=两侧,展开=是)
root.bind(“,setbold)
text.tag_config(“b”,font=('Verdana','10','bold'))
text.tag_config(“i”,font=('Verdana','10','italic'))
def removeformat(事件=无):
text.tag_remove('b',SEL_FIRST,SEL_LAST)
text.tag_remove('i',SEL_FIRST,SEL_LAST)
def setbold(事件=无):
removeformat()
text.tag\u add('b',SEL\u FIRST,SEL\u LAST)
text.edit\u modified(真)
def main():
init()
mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
它应该做的只是生成一个文本窗口,您可以在其中写入内容。
选择一些文本并按Ctrl+B,程序应删除任何先前存在的标记,然后为其指定将文本设置为粗体的“B”标记
相反,在第一次标记_remove
时发生了一个异常,告诉我文本不包含任何标记为“sel”的字符
使用返回'break'
的建议没有用,因为在setbold()
有机会执行操作之前,选择将消失…将绑定设置在文本小部件上,而不是根部件上。(整个顶级绑定是在小部件类绑定之后处理的,其中标准的
绑定是在小部件实例绑定之后处理的,这就是您想要在这里使用的。)您需要这样做'break'
;它禁止后续绑定。(如果在此之后出现任何问题,可能是默认情况下焦点错误,但这很容易修复。)
唯一的另一种选择是重新配置BindTag,以便在顶级绑定之后处理类绑定,但这样做的后果非常微妙和深远;您应该使用我第一段中的简单方法,因为这是处理这些事情的正常方式。绑定是按照特定顺序处理的,由该小部件的bindtags
定义。默认情况下,此顺序为:
特定小部件
小部件类
顶层窗口
特殊类“所有”
如果存在冲突绑定(例如,小部件和类上的control-b绑定),则它们都将触发(按描述的顺序),除非您通过返回“break”
来中断链
但是,对于您发布的代码,您绑定到顶级窗口(即:根窗口),而冲突绑定在类上。因此,在顶级处理该类之前,该类将触发绑定,因此即使绑定返回“break”
,也无所谓,因为类绑定首先发生
最直接的解决方案是将绑定移动到实际的小部件并返回“break”
。这将保证您的绑定首先触发,返回“break”
保证类绑定不会触发
如果确实希望在根窗口上进行绑定,可以使用类的值为“Text”
的bind\u class
方法删除该类的绑定
您可能会发现effbot.org上的页面很有用 需要明确的是,非顶级绑定组的标准顺序如下:小部件实例、小部件类、顶级实例、全局。(对于toplevels,widget实例是toplevel实例,如果您没有预料到它会导致问题。)可以使用bindtags更改此顺序,插入新组并删除旧组;这是一种非常先进的技术,很有趣,但在您用尽所有简单的替代方法之前,不能在生产代码中使用。是的,就是这样!现在-如果你愿意给我进一步的建议。。。我仍然有一个令人惊讶的事实,Ctrl-1。。。Ctrl-5是不可绑定的,即无论我尝试什么,都不会触发事件!相反,令人惊讶的是,从Ctrl-6到Ctrl-9都能正常工作。有什么想法吗???