我正在尝试在 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
等)。