【问题标题】:How to bind an event to a ribbon button click in wxpython-phoenix如何将事件绑定到 wxpython-phoenix 中的功能区按钮单击
【发布时间】:2016-12-24 21:43:36
【问题描述】:

我想知道如何在 wxpython 中为 python 3.4(Phoenix 版本 3.0.3)使用带功能区按钮的绑定方法,因为我尝试了所有可能的菜单和按钮使用方法,但我一直有错误看起来像:

文件“C:\Anaconda3\lib\site-packages\wx\core.py”,第 1200 行,在 _EvtHandler_Bind 中 断言源是 None 或 hasattr(source, 'GetId') 断言错误

如果可能,请提供简单示例。提前致谢。

【问题讨论】:

    标签: python python-3.x event-handling wxpython ribbon


    【解决方案1】:

    我找到了解决问题的方法

    import wx.ribbon as RB
    

    代替:

    import wx.lib.agw.ribbon as RB
    

    并绑定:

    import wx
    import wx.ribbon as RB
    # Class code goes here...
    self.ribbon = RB.RibbonBar(self,wx.NewId())
    self.page_home = RB.RibbonPage(self.ribbon, wx.NewId(), "Home")
    self.panel1 = RB.RibbonPanel(self.page_home, wx.ID_ANY, "Panel#1")
    self.button_bar1 = RB.RibbonButtonBar(self.panel1)
    bmp = wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_OTHER, wx.Size(32, 32))
    self.button_bar1_Exit = self.button_bar1.AddButton(wx.ID_ANY, "Exit", bmp, 'Close Window')
    self.button_bar1.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.on_button_bar1)
    def on_button_bar1(self, event):
        button = event.GetButton()
        if button == self.button_bar1_Exit:
            self.Close()
    

    我会留下对我非常有用的答案,暂时不接受它,以便有机会获得更好的想法,如果没有,我会接受我的。

    【讨论】:

    • 我实际上对 wxpython 不是很专业,所以作为我的问题的一部分,谁能告诉我两者有什么区别
    • 抱歉,我的意思是在 'wx.ribbon' 和 'wx.lib.agw.ribbon' 之间?如果有必要把它放在单独的问题中,请告诉我。
    • wx.ribbon 包含围绕 C++ 功能区类的包装器。 wx.lib.agw.ribbon 包含仅用 Python 代码编写的替代实现。通常,这样的东西大多与封装的 C++ 版本兼容,但它们往往更容易让 Python 开发人员调试、使用自己的自定义代码进行扩展等。
    【解决方案2】:

    如果您为每个按钮分配一个 ID 而不是使用 wx.ID_ANY,则可以将特定的事件处理程序绑定到每个按钮。它比在单个事件处理程序中拥有一个庞大且不断增长的 if/elif/else 块更干净。

    import wx
    import wx.ribbon as RB
    
    BUTTON_EXIT_ID = wx.NewId()
    
    # Class code goes here...
    self.ribbon = RB.RibbonBar(self,wx.NewId())
    self.page_home = RB.RibbonPage(self.ribbon, wx.NewId(), "Home")
    self.panel1 = RB.RibbonPanel(self.page_home, wx.ID_ANY, "Panel#1")
    self.button_bar1 = RB.RibbonButtonBar(self.panel1)
    bmp = wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_OTHER, wx.Size(32, 32))
    self.button_bar1_Exit = self.button_bar1.AddButton(BUTTON_EXIT_ID, "Exit", bmp, 'Close Window')
    self.button_bar1.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.on_exit, id=BUTTON_EXIT_ID)
    
    def on_exit(self, event):
        self.Close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2011-05-30
      相关资源
      最近更新 更多