Pythonでマクロ(6):ラジオボタンを使う

「ラジオボタン」というコントロールがある(libreOfficeではオプションボタンと呼んでいる)。名前の由来は古いラジオには選局用のボタンが複数付いており、選局はそのボタンの一つを押すとその局の放送が聞けるようになっていた。当然他の局のボタンはオフの状態になる。つまり複数のボタンの一つをオンにするとその他のボタンは自動的にオフになるような複数のボタンがラジオボタンである。

【配置】今回は「ラジオボタン」を三つ、普通の「ボタン」を一つ、そして「テキストボックス」を一つ配置する。詳細は省くがこのままでは三つの「ラジオボックス」はそれぞれ独立して動く。この三つの「ラジオボックス」をコントロールの一つである「グループボックス」で囲ってやると、この三つは連動して動く。

ラジオボタンを含むダイアログ (三つのラジオボタンを囲むグループボックスが微かに見える)

【マクロ】このダイアログの意図していることは「ラジオボタンの一つを選択し、「確認」ボタンを押すと選択したボタンのラベルが表示される」である。

試作したマクロを示す:


#coding: utf-8
import uno
import screen_io as ui
import unohelper
from com.sun.star.awt import XActionListener

class MyActionListener(unohelper.Base, XActionListener):
  def __init__(self, rbtns, langs):
    self.rbtns = rbtns
    self.langs = langs
  def actionPerformed(self, evnt):
    for i, rbtn in enumerate(self.rbtns):
      if rbtn.State:
        print(self.langs[i])
        msg = 'やっぱり'+self.langs[i] + 'ですね'
        ui.Print(msg)

def createDialog():
  ctx = XSCRIPTCONTEXT.getComponentContext()
  smgr = ctx.getServiceManager()
  dp = smgr.createInstanceWithContext("com.sun.star.awt.DialogProvider", ctx)
  dialog = dp.createDialog("vnd.sun.star.script:Standard.Dialog1?location=application")
#コントロールの登録
  rbtn1 =  dialog.getControl("radioButton1")
  rbtn2 =  dialog.getControl("radioButton2")
  rbtn3 =  dialog.getControl("radioButton3")
  rbtns =[rbtn1, rbtn2, rbtn3]
  langs = ['Python', 'Java', 'Perl']
  cmdbtn1 = dialog.getControl("commandButton1") 
#エヴェント監視(ボタンが押されたとき)
  btn1_listener = MyActionListener(rbtns, langs)
  cmdbtn1.addActionListener(btn1_listener)
  dialog.execute()
  dialog.dispose()

各ラジオボタンのオン。オフの状態は各ボタンの属性Stateの値で判定できる。