【问题标题】:How to position the insertion cursor under the mouse pointer, after creating a tkinter text widget by a event?通过事件创建 tkinter 文本小部件后,如何将插入光标定位在鼠标指针下方?
【发布时间】:2023-02-07 01:38:18
【问题描述】:

我希望用户能够编辑画布文本项。由于 canvas-text 项目的功能比 text-widget 少,我想使用 text-widget 进行编辑。因此,当开始编辑时,通过鼠标双击事件,我在画布文本项上打开一个新的画布窗口项,并在其中放置一个文本小部件。然后我将画布文本项的文本插入到文本小部件中。当然,文本小部件的插入光标现在位于文本小部件的末尾。但我希望它位于鼠标双击发生的位置。我怎样才能做到这一点?

这是我的代码:

import tkinter as tk

def edit_text(event):
    coords = canvas.bbox(canvas_text)
    text_ref = tk.Text(root, font=("Courier", 10))
    canvas_window = canvas.create_window(coords[0], coords[1], window=text_ref, anchor="nw")
    text_ref.bind("<Escape>", lambda event: store_edits(text_ref, canvas_window))
    text_ref.insert("1.0", canvas.itemcget(canvas_text, "text"))
    text_ref.focus_set()

def store_edits(text_ref, canvas_window):
    canvas.itemconfig(canvas_text, text=text_ref.get("1.0", "end"))
    canvas.delete(canvas_window)
    del text_ref

root = tk.Tk()
canvas = tk.Canvas(root)
canvas.grid()

canvas_text = canvas.create_text(100, 100, text="aaa\n456\n123\n123\n456\n123\nbbb\n", font=("Courier", 10))
canvas.tag_bind(canvas_text, "<Double-Button-1>", edit_text)

root.mainloop()

我问,因为我相信我不是第一个遇到这个问题的人。

【问题讨论】:

    标签: python tkinter mouseevent text-widget


    【解决方案1】:

    我找到了一个简单的解决方法:用户必须引入不是双击鼠标,而是三次鼠标单击。与计算光标位置的可能复杂的想法相比,这是非常容易的。

    【讨论】:

      【解决方案2】:

      您可以使它更容易,只需启用或禁用您的文本小部件。但是,Double-Button-1 已经用于标记单词。所以你可能想选择另一个绑定。

      import tkinter as tk
      
      def edit_text(event):
          state_txt = txt_box['state']
          if state_txt == 'disabled':
              txt_box.config(state="normal")
          elif state_txt == 'normal':
              txt_box.config(state="disabled")
      
      
      root = tk.Tk()
      txt_box = tk.Text(root, font=("Courier", 10))
      txt_box.grid()
      
      txt_box.insert('1.0', "aaa
      456
      123
      123
      456
      123
      bbb
      ")
      txt_box.config(state="disabled")
      txt_box.bind("<Double-Button-1>", edit_text)
      
      root.mainloop()
      

      【讨论】:

      • 这个答案没有用,因为它删除了画布文本项。但我想使用画布文本项,因为它是复杂画布图形的一部分。当然,我可以使用其中包含文本小部件的画布窗口项目,但是从画布创建后记会有黑洞,其中使用了画布窗口项目。
      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多