2017-01-16 6 views
0

Я новичок в python, но хочу учиться. У меня есть набор аппаратных средств для получения сенсорных координаторов и рисования линии в соответствии с координаторами.wxpython: Как пройти координатор XY и вытащить его?

Моя проблема заключается в том, что wxpython не будет рисовать линию, если координатор изменится. вот мой код: https://github.com/eleghostliu/homework/blob/master/DrawXY_byWxPython/PythonApplication1/PythonApplication1.py

может кто-нибудь посоветуйте, спасибо.

ответ

0

Вы зарегистрированы для EVT_PAINT, но вы не инициируете событие при изменении данных. Кадр не знает, изменились ли данные или нет, если вы специально не сообщили об этом.

Вы можете вызвать событие, просто вызвав

frame.Refresh()

Вы можете подключить его несколькими способами. Например, вы можете передать frame.Refresh связанный метод в качестве параметра в MainProcess, чтобы он мог вызвать вызов функции для обновления фрейма. Что-то вроде следующего:

ПРЕДУПРЕЖДЕНИЕ: Ошибочное кусок кода

# Start a socket server 
def MainProcess(refresh_callback): 
    while True: 
     refresh_callback() 
*********************************************** 
frame = DrawPanel() 
frame.Show() 
start_new_thread(MainProcess, (frame.Refresh,)) 

Edit:

выше кусок кода вызова методов интерфейса напрямую не так!

Рабочая нить не должна напрямую манипулировать графическим интерфейсом, а должна сообщать об этом графическому интерфейсу, и поток GUI, который является основным потоком, будет обрабатывать его в своем контексте. Здесь снова есть несколько подходов, самый быстрый для реализации - через wx.CallAfter.

Что вы можете включить, как показано ниже, вместо прямого вызова функции:

wx.CallAfter(refresh_callback)

Другой способ обработки связи между рабочим и GUI нити через wx.PostEvent.

class DrawPanel(wx.Frame): 
    """Draw a line to a panel.""" 
    def notify(self): 
     wx.PostEvent(self, wx.PaintEvent()) 

Тогда из вторичного потока, можно смело назвать frame.notify() при получении новых данных.

Для более элегантного решения, включающего wx.CallAfter, см. https://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/, где используется pubsub.

+0

спасибо. оно работает. Но линия не непрерывна, только две точки могут быть связаны линией. Я попытался отметить dc.Clear(), но все же не работает. –

+0

Пожалуйста, обратитесь моей ревизия коды, https://github.com/eleghostliu/homework/blob/master/DrawXY_byWxPython/PythonApplication1/PythonApplication1.py он получил мерцающий вопрос экрана, он показывает всю трассу линии и исчезают (не обязательно, если вызвано dc.Clear()), и покажите весь трек строки следующего кадра. –

+0

Обратитесь к https://wiki.wxwidgets.org/Flicker-Free_Drawing –

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

  • Нет связанных вопросов^_^