【发布时间】:2017-02-05 20:52:55
【问题描述】:
我正在尝试增强 Tkinter Text 小部件并提供额外的功能。
我的新小部件的主要功能之一是破解箭头/键盘击键(语法突出显示、自动完成上下文菜单)。
我尝试了将 Key 和 Up/Down 击键绑定到方法的直接方法,但这种方法失败了,因为我的方法处理程序在 Text 事件处理程序之前执行,因此我的方法在文本本身处理的最后一次击键之前执行。
class Editor(Frame):
def __init__(self, parent, *args, **kwargs):
Frame.__init__(self, parent) # initialize the base class
# The Main Text Widget
self.text = scrolledtext.ScrolledText(self, *args, **kwargs)
self.text.pack(side='left', fill='both', expand=1)
self.text.bind("<Key>", lambda event: self.editor_key_handler())
self.text.bind("<Up>", lambda event:self.editor_arrow_key_handler('Up'))
self.text.bind("<Down>", lambda event: self.editor_arrow_key_handler('Down'))
然后我尝试切换 bindtag 顺序,让 Class 处理程序先运行,然后是我的实例处理程序 - 这确实解决了原始问题:
bindtag = list()
bindtag.append(self.text.bindtags()[1])
bindtag.append(self.text.bindtags()[0])
bindtag.append(self.text.bindtags()[2])
bindtag.append(self.text.bindtags()[3])
self.text.bindtags(bindtag)
但是现在因为我的处理程序在 Text 之后运行...我的 Up / Down 处理程序在插入光标已经移动到 Text 内丢失用户单击 Up 的原始位置之后运行/向下箭头。
作为一名经验丰富的 Perl Tk 程序员,我开始尝试派生 Tkinter Text 小部件,以允许我劫持 Up/Down 默认处理程序并提供我自己的自定义方法..
我没有找到一种方法来简单地派生和覆盖 Text 小部件(这对于 OOP 系统来说似乎微不足道。)
如何做到这一点?
【问题讨论】:
-
也许你需要
<KeyRelease> -
@furas:这会在击键和处理程序(语法突出显示)之间产生令人讨厌的延迟,并且也不支持按住键(在 windows10 上一次又一次地键入键)