2013-05-04 3 views
0

Я пытаюсь показать очень большую карту в прокручиваемом окне. Идея состоит в том, что у вас есть сетка квадратных плиток с изображением для каждой плитки, и вы можете прокручивать их, чтобы увидеть их. Каждая плитка также имеет некоторую числовую информацию (я мог бы нарисовать ее с помощью wx.StaticText), и вы можете щелкнуть и щелкнуть правой кнопкой мыши по фрагментам для выполнения определенных действий.Очень большой wx.ScrolledPanel рендеринга

Мой первый проход на этом должен был использовать wx.Panel для каждой плитки и wx.ScrolledWindow для карты. Однако wx.ScrolledWindow, по-видимому, имеет очень низкую производительность с большим количеством фрагментов (свитки со скоростью около 4 кадров в секунду).

Моя следующая попытка состояла в том, чтобы использовать flyweight pattern, имея ровно 9 больших панелей, которые отображают около ста плиток с использованием wx.dc. Когда пользователь прокручивается в одном направлении, а панели выходят из экрана, я добавляю их в тупик и перенастраиваю новые панели из тупика. Тем не менее, это, похоже, не очень хорошо работает, потому что при каждом изменении панели появляется знаковое мерцание. Кроме того, кажется, что панели внутри wx.ScrolledWindow расположены (например, panel.SetPosition(...)) в соответствии с текущей позицией прокрутки, а не с местом происхождения виртуального пространства, и это затрудняет избегание условий гонки, поскольку положение прокрутки может меняться, в то время как панели все еще реконфигурируются.

Каков рекомендуемый образец для рендеринга очень большого прокручиваемого содержимого в wxPython? Я знаком с тем, как добиться этого в своем родном WM, и я видел fairly large scroll areas, реализованный в wxWidgets. Но, похоже, нет примеров для большого содержимого прокрутки для wxPython.

ответ

0

Видимо, лучший способ прокрутки большого содержимого - wx.lib.floatcanvas. Есть разумная демо-версия on GitHub. Это не совсем родная скорость, но удобна даже при больших размерах графа.

Я не понял, как сделать 2D-мультитач-панорамирование, которое поддерживает родной скроллер (на Mac), поскольку он не отображается в событиях MouseWheel. Это может быть недостатком, если это важно для кого-то, но для моего проекта это не конец света.

Смежные вопросы