Почему разрывы строк не работают в wxpython RichTextCtrl

#python #user-interface #wxpython #wxwidgets

#python #пользовательский интерфейс #wxpython #wxwidgets

Вопрос:

Я работаю над умеренно сложной программой редактирования текста с использованием wxpython, и я столкнулся со странной проблемой. Я не могу вставить разрывы строк в последнюю строку абзаца.

Ниже приведен минимальный рабочий пример кода в python3 wxPython 4.1.0, который позволяет вставлять разрывы строк в некоторые абзацы.

Обратите внимание, что даже разрыв строки в параграфе 2, который есть в коде, не отображается в графическом интерфейсе. И если вы перейдете к последней строке и нажмете Shift Enter, которые обычно вставляют разрыв строки, это не сработает. Это работает во второй строке и первой строке, но не в последней строке. Та же проблема возникает внутри первой ссылки. Но, как ни странно, вы можете вставить разрыв строки во вторую ссылку.

Я подозреваю, что я делаю что-то не так со стилями, но я не могу выяснить, что. У кого-нибудь есть идеи? Спасибо.

 import wx
import wx.richtext as rt


class RichTextFrame(wx.Frame):
    def __init__(self, *args, **kw):
        wx.Frame.__init__(self, *args, **kw)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.rtc = rt.RichTextCtrl(self, style=wx.VSCROLL | wx.HSCROLL | wx.NO_BORDER)
        self.sizer.Add(self.rtc, 1, flag=wx.EXPAND)
        self.SetSizer(self.sizer)
        self._stylesheet = rt.RichTextStyleSheet()
        self._stylesheet.SetName('Stylesheet')
        self._create_styles()
        self._insert_sample_text()

    def _create_styles(self) -> None:
        """
        Create styles for rich text control.
        :return: None
        """
        # Normal style
        stl_paragraph: rt.RichTextAttr = self.rtc.GetDefaultStyleEx()
        stl_paragraph.SetParagraphSpacingBefore(10)
        stl_paragraph.SetParagraphSpacingAfter(10)
        style_paragraph: rt.RichTextParagraphStyleDefinition = rt.RichTextParagraphStyleDefinition('par')
        style_paragraph.SetStyle(stl_paragraph)
        style_paragraph.SetNextStyle('par')
        self._stylesheet.AddParagraphStyle(style_paragraph)
        self.rtc.ApplyStyle(style_paragraph)
        self.rtc.SetDefaultStyle(stl_paragraph)

        # Link style
        stl_link = rt.RichTextAttr()
        stl_link.SetFlags(wx.TEXT_ATTR_URL)
        stl_link.SetFontUnderlined(True)
        stl_link.SetTextColour(wx.BLUE)
        style_link: rt.RichTextCharacterStyleDefinition = rt.RichTextCharacterStyleDefinition('url')
        style_link.SetStyle(stl_link)
        self._stylesheet.AddCharacterStyle(style_link)

    def _insert_link(self, text: str, link_id: str) -> None:
        """
        Insert a link into text at current position.
        :param text: The visible text.
        :param link_id: The ID of the link
        :return: None
        """
        self.rtc.BeginStyle(self._stylesheet.FindCharacterStyle('url').GetStyle())
        self.rtc.BeginURL(link_id)
        self.rtc.WriteText(text)
        self.rtc.EndURL()
        self.rtc.EndStyle()

    def _insert_sample_text(self) -> None:
        """
        Insert sample text.
        :return: None
        """
        self.rtc.ApplyStyle(self._stylesheet.FindParagraphStyle('par'))
        self.rtc.BeginParagraphStyle('par')
        self.rtc.WriteText('paragraph 1, sample of a longer text for testing url creation ')
        self.rtc.LineBreak()
        self.rtc.WriteText('paragraph 1, more sample of a longer text for testing url creation ')
        self._insert_link('www.google.com', 'link from code')
        self.rtc.EndParagraphStyle()

        self.rtc.Newline()

        self.rtc.ApplyStyle(self._stylesheet.FindParagraphStyle('par'))
        self.rtc.BeginParagraphStyle('par')
        self._insert_link('www.google.com', '42')
        self.rtc.WriteText(' paragraph 2 adding some text after a link')
        self.rtc.LineBreak()
        self.rtc.WriteText(' some more text after a line break in code')
        self.rtc.EndParagraphStyle()

        self.rtc.Newline()


class MyApp(wx.App):
    """
    Main class for running the gui
    """

    def __init__(self):
        wx.App.__init__(self)
        self.frame = None

    def OnInit(self):
        self.frame = RichTextFrame(None, -1, "RichTextCtrl", size=(900, 500), style=wx.DEFAULT_FRAME_STYLE)
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True


if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

  

Комментарии:

1. обязательно ли использовать wxRTC? Можете ли вы использовать wxTextCtrl или wxSTC?

2. Спасибо. Поверх обычного текста мне также нужно иметь возможность вставлять URL-адреса, заголовки (которые в основном являются текстом, но больше), цветной текст и изображения. Когда я искал что-то, что может делать изображения, выскочил richtextctrl. Я не уверен, что обычный textctrl может это сделать, плюс мне нужно иметь возможность обрабатывать щелчки левой или правой кнопкой мыши по изображениям и URL-адресам. stc кажется более способным. Но я его вообще не использовал. Как вы думаете, это будет лучше при обработке абзацев и разрывов строк?

3. Я обнаружил, что LineBreak(), вероятно, не делает то, что я думаю, что он делает. «Вставляет разрыв строки в текущую точку вставки. Разрыв строки вызывает перенос в пределах абзаца и может быть введен с помощью этой функции, путем добавления значения символа RichTextLineBreakChar к текстовому содержимому или путем ввода Shift-Return . » Что мне нужно, так это обычная обычная новая строка в том же абзаце. Точно так же, как это происходит, когда вы нажимаете Shift Enter прямо здесь, в этом поле для комментариев.

4. wxTextCtrl поддерживает URL-адреса. Однако я не уверен насчет изображений. Вы можете попробовать использовать текстовый элемент управления в стиле wxTE_RICH2. Такой элемент управления текстом также поддерживает раскраску. Просто посмотрите на образец текста. Но, как я уже сказал, я не уверен, сможете ли вы вставить и обработать изображение. Попробуйте изменить образец и посмотреть, что произойдет.