「ラジオボタン」というコントロールがある(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の値で判定できる。