如何在Tkinter/TkinterDnD中通过event.x_root和event.y_root设置Text小部件插入



我想在我的文本编辑器中实现一个文本拖放功能。到目前为止,我得到了通过event.data丢弃的文本,以及通过event.x_rootevent.y_root丢弃文本的位置。请帮我设置插入光标的tk.文本下降的位置。

我使用tkdnd2.8作为扩展,使用TkinterDnD2作为包装。

这是我的代码:

import tkinter as tk
import TkinterDnD2.TkinterDnD as tkdnd

def drop(event):
print("x: %d"%event.x_root, "y: %d"%event.y_root, "text:'%s'"%event.data)

root = tkdnd.Tk()
text = tk.Text(root, width=50, height=10)
text.pack()
text.drop_target_register("DND_Text")
text.dnd_bind('<<Drop:DND_Text>>', drop)
root.mainloop()

如果我拖动一段文本";SomeText";在我的文本小部件上,这里是控制台输出:

x: 60 y: 306 text:'SomeText'

现在,我正在努力研究如何将位置从像素比例转换为字符比例,以便将其设置为文本小部件的INSERT光标,并将文本插入到我的文本小部件中。

或者,我可以只在某个位置发射一个"<Button-1>""<ButtonRelease-1>"事件吗?如果是,我该怎么做?

您可以使用格式@x,y通过坐标指定索引。来自规范的tcl/tk文档

@x,y表示覆盖文本窗口中x和y坐标为x和y的像素的字符。

您应该将事件x和y用于小部件,而不是根。这是Text小部件的标准、文档化功能。您可以使用f-string创建索引,如下所示:

index = f"@{event.x},{event.y}"

以上将产生类似于"@100200";。

您可以在任何获取索引的方法调用中使用该索引。要将其转换为数字索引,可以将其传递给index方法。例如:

numerical_index = text.index(index)

最新更新