wx.TextCtrl 对于很长的字符串为空
wx.TextCtrl is blank for very long strings
我正在尝试使用 SetValue() 方法在 wx.TextCtrl 中显示许多浮点项列表的字符串表示形式。
只要要显示的字符串的长度达到 6151 个字符,TextCtrl 就会变为空白并且不显示该字符串。我仍然可以正常复制部分文本控件并将它们粘贴到某个地方(例如文本编辑器),但文本控件本身中的字符不会出现在屏幕上。
为什么文本控件中没有显示文本控件的值?
如果字符串超过 6150 个字符,如何让它显示?
使用 SetValue 方法设置文本控件的值以及在文本控件中键入时会发生这种情况。
更改文本控件的最大长度没有帮助。
环境:
- Windows10(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()
它看起来像一个错误。根据 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/
我正在尝试使用 SetValue() 方法在 wx.TextCtrl 中显示许多浮点项列表的字符串表示形式。
只要要显示的字符串的长度达到 6151 个字符,TextCtrl 就会变为空白并且不显示该字符串。我仍然可以正常复制部分文本控件并将它们粘贴到某个地方(例如文本编辑器),但文本控件本身中的字符不会出现在屏幕上。
为什么文本控件中没有显示文本控件的值? 如果字符串超过 6150 个字符,如何让它显示?
使用 SetValue 方法设置文本控件的值以及在文本控件中键入时会发生这种情况。
更改文本控件的最大长度没有帮助。
环境:
- Windows10(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()
它看起来像一个错误。根据 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/