Scrolledpanel вызывает отставание/уродливое мерцание при создании новой панели

Предыстория. В моем проекте есть панель инструментов, кнопки которой заставляют главную панель переходить в другой раздел в зависимости от кнопки. Это делается не всеми панелями и отображением соответствующей панели; это делается путем уничтожения любой панели, которая открыта в данный момент (например, «Финансы»), и воссоздания на ее месте нужной панели (например, «Входящие»). Перерисовка панелей вызвала уродливое мерцание, поскольку виджеты или сайзеры не торопились. После добавления self.Hide() в метод инициализации каждой панели и отказа от использования Show() до тех пор, пока это не закончится, мерцание уменьшилось примерно на 90%. Переход между панелями был довольно плавным, не как в ноутбуке, но определенно приемлемым.

НО: вчера я заменил все панели на Scrolledpanel. Мне не нужны полосы прокрутки, когда я его запускаю, но люди, использующие его с другим размером экрана, могут использовать пару панелей. И... уродливое мерцание лагов возвращается с удвоенной силой!!!

Я не понимаю, как это маленькое изменение могло так сильно повлиять. Все, что я сделал, это 1. заменил конструктор панели на конструктор панели с прокруткой и 2. добавил команду Setupscrolling.

class Tasks_PanelClass(scrolled.ScrolledPanel):
  def __init__(self, parent, id):
    scrolled.ScrolledPanel.__init__(self, parent, id)


    self.Hide()

Мерцание происходит даже на прокручиваемых панелях, которые остаются свободными от полос прокрутки. Но я вижу... псевдополосу прокрутки, мерцающую на месте в течение секунды, прежде чем, очевидно, программа решит, что она ей в конце концов не нужна.

Поэтому я подозреваю, что мерцание вызвано 1. мерцанием самих псевдополос прокрутки и 2. задержкой во времени, которую они генерируют, что приводит к мерцанию всех других виджетов, таких как listctrls.

Интересно, что одним из худших и любопытных виновников мерцания является Ctrl списка. Его доля в размерчике панели равна 1; другой виджет имеет 2.

self.panelsizer.Add(self.lefthandsizer, 2, wx.EXPAND | wx.ALL, 5)
self.panelsizer.Add(self.tasksizer, 1, wx.EXPAND | wx.ALL, 5)

self.SetSizer(self.panelsizer)

self.SetAutoLayout(1)

self.SetupScrolling(scroll_x=True, scroll_y=True)
self.Show()

Но когда он мерцает... он меняет положение! Как будто это 50% панели, значит встает на свое место.

Picture1:
http://ic.pics.livejournal.com/kleio_caissa/886459/232601/600.png Трудно было уловить это на скриншоте. Но вы можете видеть, что розоватый listctrl расширяется там, где ему не место на секунду. Инструменты не видны, но этот тип мерцания настолько быстрый, что обычно его не заметно. Но аргх, listctrl!!!! Обычно он мерцает немного больше, чем это, но это все, что я смог зафиксировать. Это слишком быстро для моих пальцев, но, к сожалению, мои глаза не могут пропустить это.

Picture2:
ссылка удалена Как это выглядит после заселения. т. е. это то место, где должен быть listctrl!

Picture3: http://ic.pics.livejournal.com/kleio_caissa/886459/231775/600.png Здесь вы можете увидеть много «мерцания». Цвет такой же, как у базовой панели, скрытой за всем... так что, я думаю, она просвечивает?? Но почему? Единственная область, которую он должен просвечивать, — это длинная вертикальная линия в качестве границы.

Picture4: ссылка удалена.

Редактировать: мне разрешено только две гиперссылки, поэтому я выбрал две, показывающие мерцание. Чтобы увидеть, как они должны выглядеть, попробуйте заменить соответствующую часть URL на: 1. /886459/232200/600.png 2. /886459/232187/600.png

Я этого не понимаю. Я также не понимаю, как ДАЖЕ ЕСЛИ полосы прокрутки создают задержку, пока решает, нужны они или нет, ** почему эта задержка достаточно сильна, чтобы переопределить команду Hide() в методе инициализации каждой панели? Конечно, он должен показывать только тогда, когда он готов к показу. **

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

Я извиняюсь за все tldr, и потому что я не могу дать соответствующий код, так как он такой длинный и полный модулей. Я действительно надеюсь, что кто-то узнает, почему полосы прокрутки, кажется, переопределяют команду Hide() (или что я здесь неправильно понимаю. И снова все работало счастливо, пока я не переключил тип панели на Scrolledpanel.)

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

Дополнительно: я исследовал это и надеялся, что этот ответ (http://stackoverflow.com/questions/8675017/wxpython-panel-in-existing-window-slow-and-small) решит, но это не кажется. Я поместил этот SetupScrolling везде, о чем мог подумать, в инициализации, и это не имеет значения, похоже, Layout не имеет значения.


person Auga    schedule 15.07.2012    source источник
comment
Вместо того, чтобы уничтожать и создавать новые панели во время выполнения, рассматривали ли вы создание их всех в начале, скрытие панелей, которые вы не используете, и отображение той, которую вы используете? Если мерцание все еще сохраняется, вы можете скрыть рамку, пока не будут созданы все панели.   -  person acattle    schedule 16.07.2012
comment
Проблема в том, что все программное обеспечение было построено вокруг разрушения и воссоздания. :( Я завишу от него, чтобы убедиться, что информация на всех панелях актуальна/изменена в результате любого взаимодействия с пользователем. Как будто он обновляет все. Это еще более важно для механики стрельбы. Пользователь выбирает персонажа из списка имён, это вызывает панель с информацией о персонаже и списком действий, включая команду стрельбы.   -  person Auga    schedule 16.07.2012
comment
Когда я тестировал его, уничтожая персонажа, он выдавал ошибки, потому что listctrl и панель все еще пытались получить доступ к удаленному объекту. Единственным лекарством была опция «обновить», чтобы воссоздать раздел / мастер-панель, которая правильно заполнила бы listctrl. Возможно, приложив много усилий, можно перерисовать все виджеты, но... я боюсь, что все эти перерисовки снова начнут мерцать.   -  person Auga    schedule 16.07.2012
comment
Если бы я мог просто выяснить, почему введение SetupScrolling переопределяет мою команду self.Hide() в инициализации, все снова было бы в порядке. Или почему он решает отложить себя до тех пор, пока панель не будет воссоздана и отредактирована self.show(). Он делает один из них по какой-то раздражающей сумасшедшей причине! Почему, почему, почему... :(   -  person Auga    schedule 16.07.2012