Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 对于非常长的字符串,wx.TextCtrl为空_Python 2.7_Wxpython_Wx.textctrl - Fatal编程技术网

Python 2.7 对于非常长的字符串,wx.TextCtrl为空

Python 2.7 对于非常长的字符串,wx.TextCtrl为空,python-2.7,wxpython,wx.textctrl,Python 2.7,Wxpython,Wx.textctrl,我试图使用SetValue()方法在wx.TextCtrl中显示许多浮动项列表的字符串表示形式 一旦要显示的字符串长度达到6151个字符,TextCtrl将变为空白且不显示该字符串。我仍然可以像平常一样复制文本控件的某些部分并将它们粘贴到某个地方(例如文本编辑器),但是文本控件本身中的字符不会出现在屏幕上 为什么文本控件的值不显示在文本控件中? 如果字符串长度超过6150个字符,如何使其显示 当使用SetValue方法设置文本控件的值以及在文本控件中键入时,会发生这种情况 更改文本控件的最大长度

我试图使用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()

它看起来像一只虫子。根据,自Windows 98以来,它的最大输出应为64K,除非您的操作系统有某种奇怪的限制。实际上,您可以使用
wx.TE_RICH
样式标志之一来增加显示的字符数

我能够用Python 2.7和wxPython 3.0.2在Windows 7上使用以下代码复制您的问题:

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()

您应该在此处报告此错误:

它看起来像一个错误。根据,自Windows 98以来,它的最大输出应为64K,除非您的操作系统有某种奇怪的限制。实际上,您可以使用
wx.TE_RICH
样式标志之一来增加显示的字符数

我能够用Python 2.7和wxPython 3.0.2在Windows 7上使用以下代码复制您的问题:

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()

您应该在这里报告此错误:

感谢您确认它是一个错误-我也在等待wxWidgets团队确认。TE_丰富的解决方案对我来说已经足够了。感谢您确认它是一个bug-我也在等待wxWidgets团队确认。富饶的工作环境对我来说已经足够了。