Подсказки сетки wxPython не работают

Я пытаюсь использовать решение Майка Дрисколла для создания всплывающих подсказок в сетке 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()

Подсказка просто не отображается. Оператор печати работает так, как ожидалось, поэтому я знаю, что привязка сработала, и событие перехватывается. Я предполагаю, что мне не хватает чего-то простого - может быть, мне нужно где-то инициализировать всплывающую подсказку? - но я не уверен, что. Есть идеи?

Обновлять:

Проблема, похоже, в сочетании версии wxPython и платформы. Код работает, как и ожидалось, в Windows с wxPython 2.8.10.1. Он не работает на Mac с 2.9.2.4, но успешно с 3.0.2.0. В общем, нам нужно, чтобы пользователи нашего графического интерфейса установили дистрибутив Python Enthought Canopy, который поставляется с 2.9.2.4 (неудачная версия wxPython).

Использование event.Skip() не имеет значения.

Я подойду к этому по-другому теперь, когда я знаю, что это проблема версии wxPython.


person J Jones    schedule 30.12.2014    source источник


Ответы (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()

я не уверен, почему вы передаете сетку, поскольку она доступна через атрибут self

person Joran Beasley    schedule 30.12.2014
comment
Этот код также не показывает всплывающую подсказку (на моем Mac). Он появляется у вас? Что касается вашего комментария, в моем реальном приложении есть несколько разных сеток, поэтому я передаю его onMouseOver. - person J Jones; 30.12.2014
comment
он отлично работает в Windows, используя self.grid или локально переданный в сетке ... Я скопировал и вставил ваш код напрямую и просто изменил эти две строки, и он работает ... не уверен, почему это не на Mac - person Joran Beasley; 30.12.2014
comment
Еще одна причина для меня приобрести Mac... чтобы я мог обновить некоторые из своих старых статей. - person Mike Driscoll; 03.01.2015