Итак, в основном я сделал очень простое приложение 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()
Последнее, что я ожидал бы увидеть в качестве узкого места, это прокрутка окна программы, но больше изменение размера приложения.
Опять же, я все еще могу немного прокручивать, дажесудорожно, но когда я вывожу свою мышь из окна, она зависает. Я полагаю, что это не имеет ничего общего с изменением размеров сеток, но с какой-то неизвестной обработкой фоновых событий, которую нужно было догнать. Спасибо за ваше время, любая помощь будет очень признательна.