Принудительная перекраска окна wxPython, сюжет wxmpl - PullRequest
7 голосов
/ 23 июня 2011

У меня проблемы с обновлением окна wxPython.В настоящее время он строит график с использованием wxmpl, который можно масштабировать, панорамировать и т. Д. Иногда пользователь может нанести большой объем данных и увеличить небольшую часть, что может привести к «зависанию».Под этим я подразумеваю, что сам график не обновляется, а метки осей отображаются поверх друг друга.Он изменяет график, но не отображает обновленную информацию правильно.Если вы измените размер окна, график будет перерисован правильно.

Я потратил непомерное количество времени, копаясь в исходном коде и документации для wx, wxmpl и matplotlib ... Лучшее решение, которое я нашелс изменяет размер окна, чтобы вызвать перерисовку (таким образом, корректно отображая обновленный график).

# All of these fail - displays the same, incorrect plot
# (view is a wxmpl.PlotPanel object, which inherits from wx.Window among other things)
view.Refresh()
view.Update()
view.draw()

# This works, but is clearly less than ideal
view.SetSize((view.GetSize().width, view.GetSize().height+1))
view.SetSize((view.GetSize().width, view.GetSize().height-1))

Должен быть лучший способ - я действительно хочу знать, что wx.Window.SetSize делает сперерисовать окно и просто вызвать его вместо этого.Или есть другой метод, который я где-то пропустил?

Ответы [ 4 ]

3 голосов
/ 31 мая 2012

Команда panel.Layout () - отличный вариант, потому что это точно такой же метод, который вызывается при изменении размера вашего окна. У меня также были проблемы с методами обновления и обновления. Компоновка, кажется, работает, когда эти два терпят неудачу.

1 голос
/ 12 июня 2012

Я бы также попробовал Показать (Ложь), а затем Показать (Правда) на PlotPanel.

1 голос
/ 06 июля 2011

Если вы не можете разместить его где-либо еще, вы можете попробовать

wx.Yield()

вместо Refresh или Update.

0 голосов
/ 16 декабря 2012

В дорогостоящем вычислительном приложении, где вы ожидаете, что что-то будет рассчитано в течение более 0,1 с, и, вероятно, у вас есть какой-то пользовательский ввод, обычно не рекомендуется делать это интенсивное рисование в потоке GUI.

Не знаетвашей конкретной ситуации, но общий подход, если вы перемещаете все трудоемкие задачи (будь то вычисления, настройка изображения (например, масштабирование)) в не GUI-поток.Просто нормальный поток Python подходит, и как только вы закончите длинную часть, вы обновите свой графический интерфейс.Конечно, во время вычислений было бы удобно отображать какой-то знак «ожидания».Также отключите другие элементы управления, чтобы скучающий пользователь не смог изменить что-либо на полпути к вашим вычислениям.

Я застрял с этой проблемой с первых дней работы с Java, а затем с Python, в основном из-за сетевых операций (который НИКОГДА не должен быть в потоке GUI).

В случае, если это настройка изображения (или генерация графики), которая занимает много времени, фоновый поток может подготовить изображение в wxMemoryDC и затем wxDC :: Blit его в окнотвой выбор.Я не знаю, можно ли это сделать с вашим компонентом wxmpl.PlotPanel, поэтому вам придется исследовать это.

...