wxPython RibbonBarの使い方

情報がすごく少ないので、投稿

f:id:dzdaiju:20181125190652p:plain
f:id:dzdaiju:20181125190352p:plain

wxFormBuilder3.9.0から出力されたPythonソースコードには ## PLEASE DO *NOT* EDIT THIS FILE!
とか書いてあるが、残念ながら私の技能ではソース自体修正しないと全くうまく対応出来なかった。

  • wxRibbonBarのwxExpandにチェックをつける

 横幅がRibbonBarがアイコンの位置までしか表示されない事の対策

  • ribbonButtonに適当にIDをつける
  • RibbonButtonBarにイベントを追加(なんのイベントでもOK)

 self.m_ribbonButtonBarMain.Bind( rb.EVT_RIBBONBUTTONBAR_CLICKED, self.click_ribbon_click )
 の様にイベントをrb.EVT_RIBBONBUTTONBAR_CLICKEDにソースレベルで修正

 ID毎にif文で分岐する。
 buttonId = event.GetId()


# -*- coding: utf-8 -*-

###########################################################################
## Python code generated with wxFormBuilder (version Oct 26 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc
import wx.lib.agw.ribbon as rb

ID_RIBBON_NEW = 1000
ID_RIBBON_OPEN = 1001
ID_RIBBON_SAVE = 1002
ID_RIBBON_RUN = 1003

###########################################################################
## Class TestFrame
###########################################################################

class TestFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"My Tool", pos = wx.DefaultPosition, size = wx.Size( 601,468 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        MainSizer = wx.BoxSizer( wx.VERTICAL )

        self.m_ribbonBar = rb.RibbonBar( self , \
			wx.ID_ANY, wx.DefaultPosition, wx.Size( -1,-1 ), wx.lib.agw.ribbon.RIBBON_BAR_DEFAULT_STYLE )
        self.m_ribbonPageMain = rb.RibbonPage( \
			self.m_ribbonBar, wx.ID_ANY, u"Main" , wx.NullBitmap , 0 )
        self.m_ribbonBar.SetActivePage( self.m_ribbonPageMain )
        self.m_ribbonPanelMain = rb.RibbonPanel( \
			self.m_ribbonPageMain, wx.ID_ANY, u"Main" , wx.NullBitmap , wx.DefaultPosition, \
			wx.DefaultSize, wx.lib.agw.ribbon.RIBBON_PANEL_DEFAULT_STYLE )
        self.m_ribbonButtonBarMain = rb.RibbonButtonBar( \
			self.m_ribbonPanelMain, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_ribbonButtonBarMain.AddSimpleButton( \
			ID_RIBBON_NEW, u"New", wx.Bitmap( u"new.png", wx.BITMAP_TYPE_ANY ), wx.EmptyString)
        self.m_ribbonButtonBarMain.AddSimpleButton( \
			ID_RIBBON_OPEN, u"Open", wx.Bitmap( u"open.png", wx.BITMAP_TYPE_ANY ), wx.EmptyString)
        self.m_ribbonButtonBarMain.AddSimpleButton( \
			ID_RIBBON_SAVE, u"Save", wx.Bitmap( u"save.png", wx.BITMAP_TYPE_ANY ), wx.EmptyString)
        self.m_ribbonButtonBarMain.AddSimpleButton( \
			ID_RIBBON_RUN, u"Run", wx.Bitmap( u"run.png", wx.BITMAP_TYPE_ANY ), wx.EmptyString)
        self.m_ribbonBar.Realize()

        MainSizer.Add( self.m_ribbonBar, 0, wx.ALL|wx.EXPAND, 5 )


        self.SetSizer( MainSizer )
        self.Layout()
        self.m_statusBar2 = self.CreateStatusBar( 1, wx.STB_SIZEGRIP, wx.ID_ANY )

        self.Centre( wx.BOTH )

        # Connect Events
        # self.m_ribbonButtonBarMain.Bind( wx.EVT_LEFT_DOWN, self.click_ribbon_click )
        self.m_ribbonButtonBarMain.Bind( rb.EVT_RIBBONBUTTONBAR_CLICKED, self.click_ribbon_click )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def click_ribbon_click( self, event ):
        buttonId = event.GetId()
        print('*',buttonId )
        if buttonId == ID_RIBBON_NEW :
            print('new')
        elif buttonId == ID_RIBBON_OPEN :
            print('open')
        elif buttonId == ID_RIBBON_SAVE :
            print('save')
        elif buttonId == ID_RIBBON_RUN :
            print('run')

app = wx.App(False)
 
frame = TestFrame(None)
frame.Show(True)
app.MainLoop()