wx.TextCtrl.LoadFile()使用方法

0 投票
2 回答
1930 浏览
提问于 2025-04-15 14:44

我想快速显示搜索结果的数据。我在网络驱动器上有一个大约50MB的文本文件,里面记录了所有文件的绝对路径。这个Python脚本能在一秒钟内快速读取这个文件的每一行,这个速度是可以接受的。这就是我获取结果所需的时间。

不过,结果是通过一个叫wx.TextCtrl的控件来显示的。如果一个一个地把结果添加到wx.TextCtrl里,那就太慢了。我想到的最好办法是把结果写入一个文本文件,然后用wx.TextCtrl的LoadFile方法来加载,这样根据结果的数量,加载文本的时间大约在0.1到5秒之间。但是,对于10MB以上的文本,应该有更快的方法。结果是在和图形界面同一个过程中立即计算出来的……所以,请问有没有办法可以直接把这些数据传输到TextCtrl里?使用mmap会不会帮助这个过程?

2 个回答

0

你可以用AppendText一次性加载所有数据,但为什么还要一行一行地加载呢?不过即使这样,加载10MB的数据还是需要几秒钟,因为10MB实在是太大了。如果你用wx.RichTextCtrl,速度会快一点。在我的测试中,它加载10MB数据只用了6秒,而TextCtrl则需要9秒。

我不明白为什么你需要一次性设置所有数据?谁会去读10MB的数据呢?

所以根据你的需求,可能有更好的方法。

如果你需要非常快速地显示所有数据,可以写一个自定义控件,保持一份行的列表,只渲染当前视图中可见的行。

这里有一个测试应用,你可以尝试各种方法。

import wx
import wx.richtext
import string
import time

# create a big text
line = string.ascii_letters+"\n"
bigText = line*200000

app = wx.PySimpleApp()
myframe = wx.Frame(None)
#tc = wx.TextCtrl(myframe, style=wx.TE_MULTILINE)
tc = wx.richtext.RichTextCtrl(myframe)
def loadData():
    s = time.time()
    tc.SetMaxLength(len(bigText))
    tc.AppendText(bigText)
    print time.time()-s

# load big text after 5 secs
wx.CallLater(5000, loadData)

app.SetTopWindow(myframe)
myframe.Show()
app.MainLoop()

如果你不想在自定义控件中自己绘制所有内容,可以使用一个带有独立滚动条的文本控件,在滚动时更新文本控件的内容,这样一次只加载几行数据。

补充:正如你在评论中所说的数据可能是1-2MB,使用AppendText加载1MB的数据只需要0.5秒,我觉得这样是可以的。

0

真的会有人去读(或者需要)文本框里所有的10MB内容吗?可能不会。

建议你可以按需加载,也就是分批次把数据加载进来。

或者更好的是,提供一些用户搜索功能,这样可以把结果缩小到用户感兴趣的信息。

撰写回答