我有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()
任何帮助都将不胜感激。
答案 0 :(得分:1)
如果你睡在主要的那个中,你确实需要另一个线程:-) 无论如何,正如你所知,你不能真正让wx函数在多个线程中运行,因此我建议让一个线程在队列上等待。当它在队列中找到某些东西时,它将执行滚动并调用wx.Window.Refresh()来“调度”重绘。我不确定你是否可以从线程调用Refresh,也许你必须做一些类似PostMessage的事情来告诉主线程进行刷新。
实际绘画将根据此线程准备的数据在OnPaint中完成。
在主线程中,您将处理按键并在右侧键上添加一些内容。
鼠标运动事件不应再丢失。