wxWidgets / wxPython - приложение зависает после прокрутки окна, заполненного текстом, размером с GridSizer - PullRequest
1 голос
/ 23 октября 2019

Итак, в основном я сделал очень простое приложение wxPython, которое сочетает в себе ScrolledWindow и Gridsizers. Он имеет ваш средний кадр, панель и ScrolledWindow. В этом ScrollWindow мне удалось добавить множество таблиц с помощью GridSizer. Макет в порядке, а также хорошо изменяется, хотя и немного медленнее, но это ожидаемо. Когда я прокручиваю очень медленно, все это работает. Но когда я выполняю прокрутку быстро, она реагирует на прокрутку, даже на непрерывную прокрутку, и хорошо загружает все элементы. Но как только я прокручиваю до большого и вынимаю свою мышь из окна прокрутки, и я хочу изменить размер или перемещать панель, само приложение и все другие приложения останавливаются!

Так что я сжал код еще дальше, чтобы не строить таблицы, которые я хотел для своего основного приложения, а просто заполнить сетки 1000 строками статического текста. Проблема все еще сохраняется. Даже когда я пишу тот же фрагмент кода на C ++ и собираю его с помощью Visual Studio, проблема становится еще хуже, несмотря на то, что она компилируется! Загрузка программы заняла 1м30 секунд, а между тем все остальные программы также зависли. Мне удалось загрузить диспетчер задач и заметил, что он использует только 7 МБ ОЗУ и незначительное количество вычислительной мощности, несмотря на зависание. Я чувствую, что есть какое-то отношение к событиям: чем больше я прокручиваю, тем больше «вещей» помещается в какую-то очередь, которая исполняется, как только я убираю свою мышь из окна.

Вот код. Сначала он создаст ваш wx.Frame, затем панель. Окну с прокруткой назначается панель в качестве родительского, а вертикальная скорость прокрутки устанавливается на 20. Виртуальный размер не указан, но он будет пересчитан, когда он будет соответствовать размерам. Затем создается гридзайзер 10х100, заполненный статическими текстами, содержащими «тест». Затем эта сетка устанавливается на панель 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()

Последнее, что я ожидал бы увидеть в качестве узкого места, это прокрутка окна программы, но больше изменение размера приложения.

Опять же, я все еще могу немного прокручивать, дажесудорожно, но когда я вывожу свою мышь из окна, она зависает. Я полагаю, что это не имеет ничего общего с изменением размеров сеток, но с какой-то неизвестной обработкой фоновых событий, которую нужно было догнать. Спасибо за ваше время, любая помощь будет очень признательна.

1 Ответ

1 голос
/ 26 октября 2019

Я не знаю, каков точный источник замедления в вашем случае, кажется странным, что это не сработает. Однако это то, что вы не должны пытаться делать в первую очередь в любом случае. Под MSW существует ограничение в 10000 окон на процесс и ограничение в 32700 окон на систему. Потреблять 1000 из них просто не очень хорошая идея.

Вместо этого следует использовать wxGrid, что не создает окна для каждой ячейки - это просто слишком дорого.

...