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
。
我是 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
。