wx.TextCtrl пуст для очень длинных строк

Я пытаюсь отобразить строковое представление списка многих элементов с плавающей точкой в ​​wx.TextCtrl, используя метод SetValue().

Как только длина отображаемой строки достигает 6151 символа, TextCtrl становится пустым и не отображает строку. Я все еще могу скопировать части текстового элемента управления как обычно и вставить их куда-нибудь (например, текстовый редактор), но символы в самом текстовом элементе управления не отображаются на экране.

Почему значение текстового элемента управления не отображается в текстовом элементе управления? Как сделать так, чтобы строка отображалась, если она длиннее 6150 символов?

Это происходит при установке значения текстового элемента управления с помощью метода SetValue и при вводе в текстовом элементе управления.

Изменение максимальной длины для текстового элемента управления не помогло.

Среда:

  • Windows 10 (64 бит)
  • Python 2.7.10
  • wxPython 3.0

Пример кода:

import wx
import os
class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,-1))
        self.control = wx.TextCtrl(self)
        self.control.SetMaxLength(10000) #doesn't help

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.control, 1, wx.EXPAND)

        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)

        self.Show(True)


app = wx.App(False)
frame = MainWindow(None, "Sample editor")
app.MainLoop()

1 ответ

Решение

Это похоже на ошибку. В соответствии с этим, он должен быть максимальным с 64 КБ, начиная с Windows 98, если у вашей операционной системы нет какого-то странного ограничения. Вы можете увеличить количество отображаемых символов, используя один из wx.TE_RICH флаги стиля

Я смог повторить вашу проблему в Windows 7 с Python 2.7 и wxPython 3.0.2, используя следующий код:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        super(MyPanel, self).__init__(parent)

        self.text = wx.TextCtrl(self, value="y"*7000)
        btn = wx.Button(self, label='Line Length')
        btn.Bind(wx.EVT_BUTTON, self.onLength)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text, 0, wx.EXPAND|wx.ALL, 5)
        sizer.Add(btn, 0, wx.CENTER|wx.ALL, 5)
        self.SetSizer(sizer)


    #----------------------------------------------------------------------
    def onLength(self, event):
        """"""
        print len(self.text.GetValue())

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        super(MyFrame, self).__init__(parent=None, title='Test')
        panel = MyPanel(self)
        self.Show()


if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

Если я добавлю wx.TE_RICH флаг и звонок Layout()Я могу заставить его работать, хотя:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        super(MyPanel, self).__init__(parent)

        self.text = wx.TextCtrl(self, value="y"*7000, style=wx.TE_RICH)
        btn = wx.Button(self, label='Line Length')
        btn.Bind(wx.EVT_BUTTON, self.onLength)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text, 0, wx.EXPAND|wx.ALL, 5)
        sizer.Add(btn, 0, wx.CENTER|wx.ALL, 5)
        self.SetSizer(sizer)
        self.Layout()


    #----------------------------------------------------------------------
    def onLength(self, event):
        """"""
        print len(self.text.GetValue())

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        super(MyFrame, self).__init__(parent=None, title='Test')
        panel = MyPanel(self)
        self.Show()


if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

Вы должны сообщить об этой ошибке здесь: http://trac.wxwidgets.org/

Другие вопросы по тегам