Выделить текст поверх нескольких TextCtrls в wxpython
Так что в настоящее время у меня есть ScrolledPanel, которая содержит несколько TextCtrls, которые программно помещаются в вертикальный BoxSizer. Причина, по которой я делаю это вместо того, чтобы просто добавлять строки в один большой прокручиваемый TextCtrl, заключается в том, что я также могу добавлять другие элементы управления между TextCtrl, такие как изображения или стилизованные элементы свертывания / свертывания.
Однако эта конкретная реализация вызывает проблему, а именно то, что пользователь не может выбрать текст в нескольких TextCtrls. Есть ли способ сделать это, который будет быстрым, чистым, идиоматическим, и не особенно грязным? Мой лучший выбор - написать алгоритм выбора текста с указателем-местоположением, который по сути заново изобретает колесо для выбора текста из базовых собственных библиотек, или есть более простой способ встроить другие элементы управления в многострочный прокручиваемый TextCtrl или даже выделять текст через несколько TextCtrls изначально?
1 ответ
Я бы держался подальше от попыток переопределить элементы управления выделением текста, если это вообще возможно, так как это неизбежно станет очень грязным и очень быстрым. Другой способ решения этой проблемы - использование одного многострочного виджета textctrl с другими прикрепленными над ним виджетами. Это также грязно, но не так.
Вы можете поместить другие виджеты поверх textctrl, просто поместив их непосредственно в ту же позицию, что и textctrl, при условии, что другие виджеты имеют того же родителя, что и textctrl. Это должно работать, если вы не перекрываете vscrollbar (или, что еще лучше, удалите его полностью с помощью style=wx.TE_NO_VSCROLLBAR).
Следующее, что вам нужно сделать, - это предварительно заполнить и поместить текстовое пространство так, чтобы пользователь мог контролировать текст только сразу после позиции каждого виджета. У вас должна быть каждая строка текста с различным параметром интервала, установленным с параметрами интервала wx.TextAttr (более общие версии двойного интервала и т. Д.), Которые вы рассчитываете на основе определенного интервала виджетов, который вы дали вашему приложению, Это необходимо, чтобы заставить пользователя печатать только там, где вы хотите.
Затем вам нужно установить привязку к символу новой строки textctrl, который пересчитывает интервал, необходимый для каждой строки. Как только вы поймете, как обрабатывать интервалы, это не должно быть слишком сложным.
Наконец, после того, как вы выделите текст, просто сбросьте все до того же интервала или того, что вам больше подходит, чтобы вы не получили неловких разрывов строк, когда вставляете его обратно в другое место.
Я знаю, что это сложный ответ, но это сложный вопрос, который вы подняли. Я полагаю, что это наиболее эффективный способ ее решения, позволяющий избежать всех ошибок, которые могут возникнуть из-за полной перестройки textctrl, но он включает в себя возиться с автокоррекцией разрывов строк и пробелов, что поначалу может быть немного сложнее.,