我正在尝试使用Mike Driscoll的解决方案在wxPython网格中制作工具提示消息,如下所述:http://www.blog.pythonlibrary.org/2010/04/04/wxpython-grid-tips-and-tricks/。这是我的最小例子。
import wx
import wx.grid
class GridFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY)
self.panel = wx.Panel(self)
self.InitUI()
def InitUI(self):
hbox = wx.BoxSizer(wx.HORIZONTAL)
self.grid = wx.grid.Grid(self, -1)
self.grid.ClearGrid()
self.grid.CreateGrid(10, 5)
self.grid.AutoSize()
self.grid.GetGridWindow().Bind(wx.EVT_MOTION, lambda event: self.onMouseOver(event, self.grid))
hbox.Add(self.grid, flag=wx.ALL, border=10)
self.panel.SetSizer(hbox)
hbox.Fit(self)
self.Centre()
self.Show()
def onMouseOver(self, event, grid):
"""
Displays a tooltip over any cell in a certain column
"""
x, y = grid.CalcUnscrolledPosition(event.GetX(),event.GetY())
coords = grid.XYToCell(x, y)
col = coords[1]
row = coords[0]
if col == 1:
msg = "This is Row %s, Column %s!" % (row, col)
print msg
event.GetEventObject().SetToolTipString(msg)
else:
event.GetEventObject().SetToolTipString('')
if __name__ == "__main__":
app = wx.PySimpleApp(redirect=False)
app.frame = GridFrame()
app.frame.Show()
app.frame.Center()
app.MainLoop()
工具提示根本没有显示出来。 print语句按预期工作,因此我知道绑定工作正常并且事件被捕获。我想我错过了一些简单的东西 - 也许我需要在某个地方初始化工具提示? - 但我不确定是什么。有什么想法吗?
更新
问题似乎是wxPython版本和平台的组合。代码在Windows上使用wxPython 2.8.10.1按预期工作。它在Mac上以2.9.2.4失败,但在3.0.2.0成功。一般来说,我们需要GUI的用户安装Python的Enthought的Canopy发行版,它随附2.9.2.4(wxPython的失败版本)。
使用event.Skip()似乎并不重要。
现在我知道这是一个wxPython版本问题,我将采用不同的方法。
答案 0 :(得分:1)
尝试使用
def onMouseOver(self, event, grid):
"""
Displays a tooltip over any cell in a certain column
"""
x, y = grid.CalcUnscrolledPosition(event.GetX(),event.GetY())
coords = grid.XYToCell(x, y)
col = coords[1]
row = coords[0]
if col == 1:
msg = "This is Row %s, Column %s!" % (row, col)
print msg
self.grid.GetGridWindow().SetToolTipString(msg)
else:
self.grid.GetGridWindow().SetToolTipString('')
#wx.Window.ToolTip()
#wx.Window.Tool
event.Skip()
我不确定你为什么要传递网格,因为它可以通过自我属性
获得