
本文共 1694 字,大约阅读时间需要 5 分钟。
最近用wxPython写了个简单的GUI程序,在实际使用过程中遇到个问题:wxPython的控件TextCtrl默认是有输入上限的。这里就简单讲述一下这个坑及解决办法,wxPython版本是4.0.4。
一 TextCtrl控件简介
TextCtrl就是输入框,可以输入和编辑其中的内容,下面是简单的程序,用来显示TextCtrl,
import wxapp = wx.App()frame = wx.Frame(None, wx.ID_ANY, "GUI", size=(300, 300))panel = wx.Panel(frame, wx.ID_ANY)textCtrl = wx.TextCtrl(panel, wx.ID_ANY, pos=(50, 20), size=(200, 200), style=wx.TE_MULTILINE)if __name__ == '__main__': frame.Show(True) app.MainLoop()
显示如下,

二 TextCtrl的输入上限及解决办法
实际使用时,需要输入一个100kb的文件,拷贝输入进去后,发现后半段数据没有出现,使用win10自带的记事本打开一个文件并拷贝,却没有问题。于是查了wxPython的API文档,发现TextCtrl有个事件叫EVT_TEXT_MAXLEN,其描述如下,
EVT_TEXT_MAXLEN: This event is generated when the user tries to enter more text into the control than the limit set by wx.TextCtrl.SetMaxLength , see its description.
意思是当用户输入的文本字符数超过了wx.TextCtrl.SetMaxLength设置的上限,就会触发这个事件。
再去看下wx.TextCtrl.SetMaxLength的描述,
SetMaxLength(self, len)
This function sets the maximum number of characters the user can enter into the control. In other words, it allows limiting the text value length to len not counting the terminating NUL character. If len is 0, the previously set max length limit, if any, is discarded and the user may enter as much text as the underlying native text control widget supports (typically at least 32Kb).
说实在的,这段英文语法还有点小难懂,看了好几遍才看懂,其意思是:如果len为0,那么之前设置的任何长度上限,都会被丢弃,这样用户可输入的数据量就由底层的原生文本控制widget来决定(典型值是至少32Kb)。
所以只要把len设置为0就可以了,这里说的底层的原生文本控制widget应该和记事本使用的控件是一样的。所以前面代码更改如下,
textCtrl = wx.TextCtrl(panel, wx.ID_ANY, pos=(50, 20), size=(200, 200), style=wx.TE_MULTILINE)textCtrl.SetMaxLength(0)
这样就可以解决这个问题了。
三 总结
本文主要讲述wxPython中TextCtrl的输入上限问题,还好wxPython的文档比较清楚,所以也比较容易debug
另外,很推荐wxPython 4.0版本,轻量而且清晰,文档也非常好,学习起来也很容易上手。
如果有写的不对的地方,希望能留言指正,谢谢阅读。
发表评论
最新留言
关于作者
