gpt4 book ai didi

python - 如何派生 Tkinter 小部件?

转载 作者:行者123 更新时间:2023-12-01 03:19:27 25 4
gpt4 key购买 nike

我正在尝试增强 Tkinter Text 小部件并提供额外的功能。

我的新小部件的主要功能之一是破解箭头/键盘击键(语法突出显示、自动完成上下文菜单)。

我尝试了将按键和向上/向下击键绑定(bind)到方法的直接方法,但这种方法失败了,因为我的方法处理程序是在文本事件处理程序之前执行的,因此我的方法是在文本本身处理的最后一次击键之前执行的。

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'))

然后我尝试切换绑定(bind)标签顺序,并使类处理程序首先运行,然后是我的实例处理程序 - 这确实解决了原始问题:

        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)

但是现在,由于我的处理程序在文本之后运行...我的向上/向下处理程序在插入光标已经移动到文本内后运行,丢失了用户单击向上的原始位置/向下箭头。

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

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

如何做到这一点?

最佳答案

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

在下面的示例中,我为向上箭头添加了一个自定义处理程序,插入“”而不是执行默认行为。请注意,处理程序返回字符串“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()

有关处理 key 时发生的情况的详细说明,请参阅此答案:https://stackoverflow.com/a/11542200/7432 。答案是关于 Entry 小部件的问题,但所有小部件的事件处理都是相同的。

关于python - 如何派生 Tkinter 小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42057155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com