wxpython: как передать XY координатор и нарисовать его?

Я новичок в python, но готов учиться. У меня есть набор аппаратных средств для приема сенсорных координаторов и рисования линии соответственно координаторам.

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

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

1 ответ

  1. Вы зарегистрировалисьEVT_PAINT, но не запускаете событие при изменении данных. Фрейм не имеет представления, изменились данные или нет, если вы специально не проинформируете его.

    Событие можно вызвать простым вызовом

    frame.Refresh()

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

    Предупреждение: ошибочный код

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

    Редактировать:

    Приведенный выше фрагмент кода, вызывающий методы UI напрямую, неверен!

    Рабочий поток не должен непосредственно управлять GUI, вместо этого он должен информировать поток GUI об изменении, и поток 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используется.