如何在wxPython中多线程处理EVT_MOTION处理程序和其他函数

时间:2014-12-01 05:00:25

标签: python multithreading wxpython

我有2个功能。

第一个函数响应一个键事件,它将已经在屏幕上绘制的所有内容向左移动(右侧)。

第二个函数是我的onMove处理程序,当鼠标移动时,它会将一条线重绘到我当前的光标位置。 (想想在cad程序中划一条线)

我的问题是,当我的屏幕正在慢慢平移时,我的鼠标移动不会被捕获。在捕捉鼠标移动的同时允许移动绘制对象的效率最高的是什么?

我怀疑多线程就是答案。但是,我按照“wxPython in Action”和wx.CallAfter()尝试了这个并没有成功。我可以使程序在该配置中成功运行,但鼠标移动问题仍然存在。

通过按“f”键处理“pan right”命令:

elif key == 70:
    timeincrement = .01
    t = .5  # number of seconds we want to move
    a = -500  # pixels per second squared
    v = 1000  # initial pixel velocity pixels per second
    x = 0  # starting time
    start = copy(parent.xloc)

    while x <= t:
        x = x + timeincrement

        # Below is the current location of the center of the screen 
        # based on the acceleration values listed above
        dist = ((v * x) + (.5 * a * x ** 2)) / (72 * parent.zoom)  

        sleep(timeincrement)
        parent.xloc = start + dist
        parent.drawingpanel.updateDrawing()

这会处理EVT_MOTION

def onMove(self, evt):
    position = evt.GetPosition()
    self.parent.mousepos = (position.x, position.y)
    self.updateDrawing()

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果你睡在主要的那个中,你确实需要另一个线程:-) 无论如何,正如你所知,你不能真正让wx函数在多个线程中运行,因此我建议让一个线程在队列上等待。当它在队列中找到某些东西时,它将执行滚动并调用wx.Window.Refresh()来“调度”重绘。我不确定你是否可以从线程调用Refresh,也许你必须做一些类似PostMessage的事情来告诉主线程进行刷新。

实际绘画将根据此线程准备的数据在OnPaint中完成。

在主线程中,您将处理按键并在右侧键上添加一些内容。

鼠标运动事件不应再丢失。