wxpython:如何传递XY协调器并将其绘制出来?

wxpython: How to pass XY coordinator and draw it out?

我是 python 的新手,但愿意学习。我有一套硬件来接收触摸协调器并根据协调器画线。

我的问题是,如果协调器发生变化,wxpython 将不会画线。 这是我的代码:https://github.com/eleghostliu/homework/blob/master/DrawXY_byWxPython/PythonApplication1/PythonApplication1.py

谁能给点建议,谢谢

您注册了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,))

编辑:

以上代码直接调用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