wxWidgets / wxPython-滚动填充了GridSizer大小的文本的窗口后,应用程序冻结

问题描述 投票:0回答:1

因此,基本上,我制作了一个非常简单的wxPython应用程序,它结合了ScrolledWindow和Gridsizers。它具有您的平均框架,面板和ScrolledWindow。在此ScrollWindow中,我设法借助GridSizers添加了很多表。布局很好,并且调整大小也很好,尽管速度稍慢,但这是可以预期的。当我非常缓慢地滚动时,一切仍然有效。但是,当我快速滚动时,它会对滚动甚至连续滚动做出反应,并很好地加载所有元素。但是,当我滚动到太多内容并将鼠标移出滚动窗口,并且想要调整面板大小或移动面板时,该应用程序本身以及所有其他应用程序将冻结!

因此,我进一步压缩了代码,以致不构建自己的主应用程序所需的表,而只是用1000个statictext字符串填充网格。问题仍然存在。即使当我用C ++编写相同的代码片段并使用Visual Studio进行构建时,即使已将其编译,问题也变得更加严重!加载程序花了1-30秒钟,同时冻结了所有其他程序。我确实设法加载了任务管理器,但注意到它尽管冻结了,但仅使用7 MB RAM和可忽略的处理能力。我觉得事件与事情有关:滚动越多,放入队列的“事物”就越多,当我将鼠标移出窗口时,该队列就会执行。

这是代码。首先它将创建您的wx.Frame,然后创建面板。滚动窗口以面板为父窗口,垂直滚动率设置为20。虚拟尺寸未指定,但是在适合定尺寸器时将重新计算。然后制作一个10x100的网格化器,并用包含“ test”的静态文本填充。然后将此网格设置为ScrolledWindows的面板,因此文本可以在滚动窗口中很好地显示。最后,将滚动窗口添加到主大小调整器以使其适合整个应用程序。

import wx

class MyForm(wx.Frame):

    def __init__(self):

        wx.Frame.__init__(self, None, wx.ID_ANY, title='Test.py')

        panel = wx.Panel(self, wx.ID_ANY)

        cols = 10
        rows = 100

        scrollWin = wx.ScrolledWindow(panel, wx.ID_ANY, size=(400, 400))
        scrollWin.SetScrollbars(0, 20, 0, 0)

        grid = wx.GridSizer(rows, cols, (5,5))

        texts = [wx.StaticText(scrollWin, wx.ID_STATIC, 'Test') for i in range(rows*cols)]
        for text in texts:
            grid.Add(text, 1, wx.ALL|wx.EXPAND, 5)

        scrollWin.SetSizer(grid)
        grid.Fit(scrollWin)

        topSizer = wx.BoxSizer(wx.VERTICAL)
        topSizer.Add(scrollWin, 1, wx.ALL|wx.EXPAND, 5)

        panel.SetSizer(topSizer)
        topSizer.Fit(self)
        topSizer.SetSizeHints(self)

        self.Show()

app = wx.App()
frame = MyForm()
app.MainLoop()

我希望瓶颈最后是滚动程序的窗口,但更多的是调整应用程序的大小。

同样,我仍然可以疯狂地滚动一点,但是当我将鼠标移出窗口时,它会冻结。我认为这与调整网格的大小没有太大关系,但是与一些未知的后台事件处理有关,需要加以处理。感谢您的宝贵时间,我们将不胜感激。

wxpython scrollbar wxwidgets
1个回答
0
投票

我不知道您的情况下减速的确切原因是什么,这似乎不奇怪,这确实很奇怪。但是,无论如何,您都不应该一开始就尝试这样做。在MSW下,每个进程限制为10000个窗口,每个系统限制为32700个窗口。消耗其中的1000个不是一个好主意。

您应该改用wxGrid,它不会为每个单元格创建一个窗口-这太昂贵了。

© www.soinside.com 2019 - 2024. All rights reserved.