如何派生Tkinter小部件?

时间:2017-02-05 20:52:56

标签: python tkinter

我正在尝试增强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 = 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 ... ...我的向上/向下处理程序在插入游标已经移动到文本内部后运行失去用户单击向上的原始位置/向下箭头。

作为一名经验丰富的Perl Tk程序员,我开始尝试派生Tkinter Text小部件,以允许我劫持Up / Down默认处理程序并提供我自己的自定义方法。

我没有找到一种方法来简单地派生和覆盖Text小部件(这对于OOP系统来说似乎微不足道。)

如何做到这一点?

1 个答案:

答案 0 :(得分:2)

向窗口小部件添加自定义事件处理的最佳方法是单独保留绑定标记,只需添加自己的绑定即返回文字字符串“break”。返回“break”将阻止触发默认绑定。

在下面的例子中,我为向上箭头添加了一个自定义处理程序,插入“”而不是执行默认行为。请注意,处理程序返回字符串“break”:

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.text = tk.Text(root)
        self.text.pack(fill="both", expand=True)

        self.text.bind("<Up>", self.handle_up)

    def handle_up(self, event):
        self.text.insert("insert", "<up>")
        return "break"

root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()

有关处理密钥时会发生什么的详细说明,请参阅以下答案:https://stackoverflow.com/a/11542200/7432。答案是关于Entry窗口小部件的问题,但事件处理对于所有窗口小部件都是相同的。