Skip to main content
 首页 » 编程设计

python之在 wxpython 中选择多个 TextCtrl 上的文本

2025年05月04日10qlqwjy

所以我目前有一个 ScrolledPanel,其中包含许多以编程方式放置在垂直 BoxSizer 中的 TextCtrl。我这样做而不只是将行附加到一个大的滚动 TextCtrl 的原因是我还可以在 TextCtrl 之间添加其他控件,例如图像或程式化的展开/收缩折叠内容。

但是,这个特定的实现会导致一个问题——即用户不可能跨多个 TextCtrl 选择文本。有没有一种方法可以做到这一点,既快速、干净、惯用,又不是特别笨拙?我最好的选择是编写一个指针位置文本选择算法,该算法本质上是为底层 native 库的文本选择内容重新发明轮子,或者是否有更简单的方法将其他控件嵌入多行可滚动 TextCtrl 中,甚至选择文本本地多个 TextCtrl?

请您参考如下方法:

如果可能的话,我不会尝试重新实现文本选择控件,因为那很快就会变得非常困惑。解决此问题的另一种方法是使用单个多行 textctrl 小部件,并在其上添加其他小部件。这也很困惑,但不那么困惑。

只要其他小部件与 textctrl 具有相同的父级,您就可以将其他小部件直接放置在与 textctrl 相同的位置上,从而将它们放在 textctrl 上。这应该有效,只要您不与 vscrollbar 重叠(或者,更好的是,使用 style=wx.TE_NO_VSCROLLBAR 将其完全删除)。

接下来您需要做的是预填充文本控件并留出空间,以便用户仅在每个小部件的位置之后才可以控制文本。你应该让每一行文本都有不同的间距设置,设置 wx.TextAttr 的间距选项(更通用的双间距版本等),你根据你给你的应用程序的特定小部件间距计算.这是强制用户仅在您希望他们输入的位置准确输入所必需的。

接下来,您需要设置一个到 textctrl 换行符的绑定(bind),以重新计算每行所需的间距。一旦你弄清楚了如何处理间距,这应该不会太困难。

最后,在您选择文本后,只需将所有内容重置为相同的间距,或您喜欢的任何其他内容,这样当您将其粘贴回其他地方时就不会出现尴尬的换行符。

我知道这是一个复杂的答案,但这是您提出的一个复杂问题。我相信,这是解决它的最有效方法,并且避免了完全检修 textctrl 时可能出现的所有错误,但它确实涉及到自动更正换行符和间距,一开始可能有点棘手.