wxPython做GUI:如何在Grid中响应鼠标移动事件

最近写一个小软件,GUI是用wxPython做的,有一个功能需要捕获鼠标在Grid控件上的移动事件。我先在Boa Constructor中
拖出一个Grid原型来做测试,发现很容易,只要grid.Bind(wx.EVT_MOTION, self.OnGridMotion) 就可以了,但是
移植到软件中去之后,死活无法响应,百思不得其解。

 

不断的尝试之下,总算发现了当Grid还没有创建网格的时候(也就是还没有CreateGrid或者SetTable的时候),是可以直接响应wx.EVT_MOTION的,但是一旦创建了网格之后就不行了。我猜测(没有Python的源码,只有C++的,懒得看了)应该是由于wxPython那不同寻常的设计方法,网格的窗口也能单独管理,由于网格挡住了Grid,所以抢先于Grid接受到wx.EVT_MOTION,而wx.EVT_MOTION不属于CommandEvent,因此不能传递给Grid。

问题找到了,我相信一定可以解决,只是苦于wxPython的资料太少。在网上寻觅2个小时后突然发现了一篇文章之中用到GetGridColLabelWindow 这个函数。眼前一亮,能得到Window不就可以操作了嘛。赶紧查wxPython API,果然有以下4个函数:
GetGridColLabelWindow(self)
GetGridCornerLabelWindow(self) 
GetGridRowLabelWindow(self) 
GetGridWindow(self) 


其中我只要用最后一个,于是我重新绑定一下:
gridWin = self.grid1.GetGridWindow()
gridWin.Bind(wx.EVT_MOTION, self.OnGrid1Motion)

测试,OK!

wxPython + Python的开发真是很爽,但没有文档也真的很头痛。希望这篇文章能为遇到相同情况的人一点帮助。

你可能感兴趣的:(Pythoner)