【问题标题】:wx.TextCtrl is blank for very long stringswx.TextCtrl 对于很长的字符串是空白的
【发布时间】:2016-02-17 16:14:46
【问题描述】:

我正在尝试使用 SetValue() 方法在 wx.TextCtrl 中显示许多浮动项目列表的字符串表示形式。

一旦要显示的字符串长度达到 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()

【问题讨论】:

    标签: python-2.7 wxpython wx.textctrl


    【解决方案1】:

    它看起来像一个错误。根据this 的说法,自 Windows 98 以来,它应该最大为 64K,除非您拥有的操作系​​统有某种奇怪的限制。您实际上可以使用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/

    【讨论】:

    • 感谢确认它是一个错误 - 我也在等待 wxWidgets 团队确认。 TE_RICH 解决方法对我来说已经足够了。
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2018-04-13
    相关资源
    最近更新 更多