【问题标题】:How to derive a Tkinter widget?如何派生 Tkinter 小部件?
【发布时间】: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 系统来说似乎微不足道。)

如何做到这一点?

【问题讨论】:

  • 也许你需要&lt;KeyRelease&gt;
  • @furas:这会在击键和处理程序(语法突出显示)之间产生令人讨厌的延迟,并且也不支持按住键(在 windows10 上一次又一次地键入键)

标签: python tkinter


【解决方案1】:

向小部件添加自定义事件处理的最佳方式是不理会绑定标签,而只需添加您自己的返回字符串“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 小部件的问题,但所有小部件的事件处理都是相同的。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2014-10-13
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多