我想在我的文本编辑器中实现一个文本拖放功能。到目前为止,我得到了通过event.data
丢弃的文本,以及通过event.x_root
和event.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)