2

我正在尝试在 Kivy 中构建自己的富文本编辑器,因为它尚不存在。我现在的方法是将标记的文本存储在文本输入框中,并将呈现的文本显示在 RST 文档中。我有一个绑定,只要文本更改,RST 文档就会更新。链接到图片:顶部显示带有纯文本的文本输入。底部显示渲染文本

现在,我在将 RST 文档上的点击转换为文本编辑器上相应的光标位置时遇到问题。我的 x 轴识别工作正常,但 y 轴没有。对于我为示例 RST 文档单击的任何行,我的光标始终位于最后一行。代码如下所示

class Rendered(RstDocument):
    def __init__(self, text="", **kwargs):
        super(Rendered, self).__init__(**kwargs)
        self.text = text

class TextArea(TextInput):
    def __init__(self, **kwargs):
        super(TextArea, self).__init__(**kwargs)
        self.text = "Filler text"

class Editor(BoxLayout):
    def __init__(self, **kwargs):
        super(Editor, self).__init__(**kwargs)

        self.txt = TextArea()
        self.rst = Rendered(self.txt.text)
        self.txt.bind(text=self.updateRST)

        self.orientation = "vertical"
        self.add_widget(self.txt)
        self.add_widget(self.rst)
        self.rst.render()

    def focusInput(self, *args):
        self.txt.focus = True

    def updateRST(self, *args):
        self.rst.text = self.txt.text

    def on_touch_down(self, touch):
        if self.rst.collide_point(*touch.pos):
            #Get mouse click
            coord = self.rst.to_window(*touch.pos)
            #Get new cursor position using mouse click
            newCoord = self.txt.get_cursor_from_xy(coord[0]-5.4,coord[1])
            #Set new cursor position
            self.txt.cursor = (newCoord[0],newCoord[1])

我正在使用该to_window()函数来获取点击位置,因为它最接近预期位置。我使用常数5.4来细化 x 轴位置。但是newCoord[1] 总是返回textinput. 部分问题是坐标系从左下角开始。单击前几行时,我的 y 值总是非常大,这就是我认为发生这种行为的原因,但是如果我使用to_local而不是to_window,即使 y 坐标值在文本旁边从零开始,返回的线值仍然是最大值。我该如何解决?

如果您对我如何制作富文本编辑器有任何建议(即,使用不同的技术关联光标位置),我很想听听!现在,如果没有标记,我可以识别正确的 x 轴位置。如果有,我可以为每个存在的标记符号增加光标位置,但对于更复杂的标记(如项目符号),这个技巧可能效果不佳。

编辑 我意识到,由于文本输入存储在顶部,它的 y 坐标远大于 RST 文档的 y 坐标。如果我将 RST 文档与 TextInput 相邻放置,则 y 坐标标识可以完美工作,但 x 坐标则不行。理想情况下,我可以隐藏 TextInput 并在其上放置 RST 文档,但我不知道该怎么做。我能想到的唯一方法是不使用add_widget(TextInput)开始,但随后两个坐标都没有匹配(无论我是否使用to_window,to_widget等)。

4

0 回答 0