如果可能的话,我会远离尝试重新实现文本选择控件,因为这势必会很快变得非常混乱。解决此问题的另一种方法是使用单个多行 textctrl 小部件,并在其上附加其他小部件。这也很混乱,但不那么混乱。
您可以将其他小部件放在 textctrl 上,只需将它们直接放在与 textctrl 相同的位置,只要其他小部件与 textctrl 具有相同的父级即可。只要您不与 vscrollbar 重叠(或者更好的是,使用 style=wx.TE_NO_VSCROLLBAR 将其完全删除),这应该可以工作。
您需要做的下一件事是预先填充和间隔您的 textctrl,以便用户仅在每个小部件的位置之后才能控制文本。您应该为每一行文本设置不同的间距设置,使用 wx.TextAttr 的间距选项进行设置(双间距的更通用版本等),您可以根据您为应用程序提供的特定小部件间距计算这些选项. 这对于强制用户仅在您希望他们输入的位置准确键入是必要的。
接下来,您需要设置与 textctrl 换行符的绑定,以重新计算每行所需的间距。一旦你弄清楚如何处理间距,这应该不会太难。
最后,在您选择文本后,只需将所有内容重置为相同的间距,或者其他任何适合您的方式,这样当您将其粘贴回其他地方时,您就不会遇到尴尬的换行符。
我知道这是一个复杂的答案,但这是你提出的一个复杂的问题。我相信,这是解决它的最有效方法,并且避免了完全检修 textctrl 可能出现的所有错误,但它确实涉及搞乱自动更正换行符和间距,一开始可能有点棘手.