#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. Такой элемент управления текстом также поддерживает раскраску. Просто посмотрите на образец текста. Но, как я уже сказал, я не уверен, сможете ли вы вставить и обработать изображение. Попробуйте изменить образец и посмотреть, что произойдет.