在Grid的Cell上自动弹出PopupWindow遇到的问题
代码如下。基本可以正常运行,当鼠标到了某个Cell上时,自动在该Cell内显示一个PopupWindow。
现在的问题是,当滚动Grid的滚动条之后,PopupWindow就显示错位了。有经验的指点一下,先谢了。
import wx
import wx.grid as grd
class TestPopup(wx.PopupTransientWindow):
def __init__(self, parent, style):
wx.PopupTransientWindow.__init__(self, parent, style)
btn = wx.Button(self, -1, "Test", (0, 0))
sz = btn.GetBestSize()
self.SetSize( (sz.width, sz.height) )
wx.CallAfter(self.Refresh)
class MyGrid(grd.Grid):
def __init__(self, parent):
grd.Grid.__init__(self, parent, -1, pos=(10,40), size=(350,110))
self.CreateGrid(30,1)
self.SetRowLabelSize(50)
self.SetColLabelSize(20)
self.SetDefaultRowSize(30)
self.SetColSize(0, 300)
class TestFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test Frame", size=(800,600))
self.grid = MyGrid(self)
self.grid.SetFocus()
self.CentreOnScreen()
self.grid.GetGridWindow().Bind(wx.EVT_MOTION, self.OnMouseOver)
def OnMouseOver(self, evt):
x,y = self.grid.CalcUnscrolledPosition(evt.GetX(), evt.GetY())
coords = self.grid.XYToCell(x, y)
row = coords[0]
col = coords[1]
try:
self.win.Show(False)
self.win.Destroy()
except:
pass
if 0 == col:
self.win = TestPopup(self, wx.SIMPLE_BORDER)
rowsize = self.grid.GetRowSize(row)
colsize = self.grid.GetColSize(col)
w, h = self.win.GetSize()
posx = colsize * (col+1) - w
posy = rowsize * row + (rowsize - h)/2
pos = evt.GetEventObject().ClientToScreen( (0, 0) )
self.win.Position(pos, (posx, posy))
self.win.Show(True)
if __name__ == '__main__':
app = wx.App(False)
frame = TestFrame(None)
frame.Show()
app.MainLoop()
[解决办法]
posx = colsize * (col+1) - w
posy = rowsize * row + (rowsize - h)/2
posx = colsize * (col+1) - w
posy = rowsize * row + (rowsize - h)/2 - (y - evt.GetY())