【问题标题】:How to create an info icon with wxPython如何使用 wxPython 创建信息图标
【发布时间】:2017-08-17 21:15:17
【问题描述】:

到目前为止,我未能使用 wxPython 创建通俗地称为“信息图标”的东西。带有某种“i”图像的图标,在悬停时会显示较大的工具提示。

我可以为图像添加wx.StaticBitmap,但它会忽略所有SetToolTipStringSetToolTip(wx.ToolTip()) 调用。或者我可以向wx.StaticText 添加一个大工具提示,如下所示。

忽略图标还没有正确的大小。

不用说,最终工具提示需要与面板背景颜色不同的背景颜色(不是这里的焦点)。我不能使用wx.adv.RichToolTip,因为我使用的是 wxPython 3.0.2.0 osx-cocoa。

有什么好的方法可以解决这个问题?

【问题讨论】:

    标签: python wxpython wxwidgets


    【解决方案1】:

    如果您创建一个 ID 为 wx.ID_HELP 的按钮,那么您将获得该平台的股票帮助按钮(如果有的话)。然后你可以用它做任何你想做的事情,就像任何按钮一样。分配工具提示,在EVT_BUTTON 事件中执行某些操作等。请参阅StockButtons sample in the demo。如果库存图像或标签不能满足您的需求,那么您可能只使用 wx.BitmapButton 来显示您想要的图像,并且仍然具有标准的工具提示支持。

    您可能想要查看的其他内容是ContextHelp sample in the demo。它展示了如何使用wx.ContextHelpButton,当点击它时,应用程序进入上下文帮助模式。然后将为接下来单击的任何小部件显示一个弹出提示窗口。不完全符合您的要求,但可能很合适。

    【讨论】:

    • 谢谢,我添加了示例链接,将研究它们。除此之外,与@rolf-of-saxony 的反馈相同......按钮的 UX 语义不太适合“悬停在图像上”。
    【解决方案2】:

    wxArtProvider 或许能帮上忙http://docs.wxwidgets.org/trunk/classwx_art_provider.html

    import wx
    class Test(wx.Frame):
        def __init__(self,parent,msg,title):
            wx.Frame.__init__(self, None)
            self.panel = wx.Panel(self, size=(300,400))
            mainSizer = wx.BoxSizer(wx.HORIZONTAL)
            staticIcon = wx.BitmapButton(self.panel, bitmap=wx.ArtProvider.GetBitmap(wx.ART_WARNING), size=(32,32))
            mainSizer.Add(staticIcon, flag=wx.ALL, border=10)
            ttip = "xxxxxxxxxxxxxxx\n"
            ttip += "xxxxxxxxxxxxxxxxxxxxxxxxxx\n"
            ttip += "xxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
            ttip += "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            staticIcon.SetToolTipString(ttip)
            buttonText = wx.StaticText(self.panel, -1, msg, wx.DefaultPosition, wx.DefaultSize, 0)
            mainSizer.Add(buttonText, flag=wx.ALL, border=10)
            staticIcon.Bind(wx.EVT_BUTTON, self.OnButton)
            self.SetSizer(mainSizer)
            self.Show()
    
        def OnButton(self, evt):
            print "The button was pressed - display some help"
    
    if __name__ == '__main__':
        app = wx.App()
        Test(None, "Dummy Exercise", "Test 123")
        app.MainLoop()
    

    【讨论】:

    • 这看起来不错,谢谢。从用户体验的角度来看,它应该是图像上的工具提示(即悬停)或用户应该点击的按钮。
    【解决方案3】:

    如果您只想在鼠标悬停时显示工具提示,那么您需要将wx.StaticBitmap 的实例绑定到EVT_MOTION

    import wx
    
    class MyPanel(wx.Panel):
    
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
    
            bmp = wx.ArtProvider.GetBitmap(wx.ART_WARNING)
            self.image = wx.StaticBitmap(self, bitmap=bmp)
    
            self.image.Bind(wx.EVT_MOTION, self.on_mouse_over)
    
        def on_mouse_over(self, event):
            self.image.SetToolTipString('BLAH BLAH BLAH')
    
    
    class MyFrame(wx.Frame):
    
        def __init__(self):
            wx.Frame.__init__(self, None, title='Icon Mouser')
            panel = MyPanel(self)
            self.Show()
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MyFrame()
        app.MainLoop()
    

    当我运行这段代码时,我会得到这样的结果:

    【讨论】:

    • 我认为问题在于 osx-cocoa 上的 StaticBitmap 拒绝 SetToolTipString 字符串。由于我不是该操作系统的用户,因此无法以任何方式发表评论。
    • 一开始我也是这么想的。当然,在我发布这个问题之前我已经尝试过了。事实证明,如果您在 wx.EVT_MOTION 事件处理程序中设置它确实工作。
    • 您没有自定义工具提示,是吗?为什么它有圆角和黑色背景? wxPython 依赖这些系统设置吗?巧合的是,我发现了wx.PopupTransientWindow。我可以在鼠标悬停时显示一个看起来像丰富的工具提示(如演示中所示)的实例。当鼠标不再位于“触发图像”上时,找到合适的事件来杀死它可能会很棘手。
    • wxPython 尽可能使用原生小部件,所以这个工具提示可能是 Xubuntu 14.04 中使用的原生小部件。除了图像小部件之外,您还可以将EVT_MOTION 绑定到面板。当为面板触发运动事件时,您可以检查瞬态窗口是否存在,如果存在则将其销毁。
    • 我最终选择了EVT_MOTION 和一个支持超链接的自定义 HTML 工具提示:frightanic.com/software-development/…
    猜你喜欢
    • 2014-04-11
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多