【问题标题】:How to set Text widget insert cursor by event.x_root and event.y_root in Tkinter/TkinterDnD如何在 Tkinter/TkinterDnD 中通过 event.x_root 和 event.y_root 设置文本小部件插入光标
【发布时间】:2020-09-09 14:59:50
【问题描述】:

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

我使用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 光标并将文本插入到我的文本小部件中。

或者,我可以在特定位置发出"&lt;Button-1&gt;""&lt;ButtonRelease-1&gt;" 事件吗?如果是这样,我该怎么做?

【问题讨论】:

  • 您应该可以使用"@60,306" 作为.insert() 的第一个参数来直接将文本放置在放置位置。
  • @jasonharper 嗨,"@60,306" 是什么意思?我在 Google 上没有得到这个字符串的任何结果。

标签: python tkinter


【解决方案1】:

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

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

您应该将事件 x 和 y 用于小部件,而不是用于根。这是Text 小部件的标准、记录功能。您可以使用 f 字符串来创建索引,如下所示:

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

上面会产生类似“@100,200”的东西。

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

numerical_index = text.index(index)

【讨论】:

  • 感谢您的回答!但是对于event.xevent.y 它会抛出一个异常:AttributeError: 'DnDEvent' object has no attribute 'x'
  • @EricKwok:啊,我没有意识到这一点。我想您必须查阅文档以查看它具有哪些属性。它似乎与其他事件不一致。无论如何,解决方案是为索引使用@x,y 格式
  • 再次感谢@x,y 解决方案。我将弄清楚如何通过x_rooty_root 计算精确坐标:)
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2011-03-14
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多