LibreOffice のマクロを Python で書いた場合の、「OK」ボタンが1つだけのダイアログボックスと、「はい」「いいえ」の選択肢のあるダイヤログボックスの使い方。
情報をググってみても、なんか「表示させるまで」の情報や、「OK」ボタン一個だけの場合の情報ばかりが多かったので、具体的な例をあげとこう。
a.セルに値をセットする時、すでに値がセットされていたら上書きするか確認表示
b.読み込むファイルが無い時、その旨をアラート表示
ソースは以下のとおり。(@ty21kyさんの Qiita の記事を参考に)
#!/usr/bin/env python# -*- coding: utf-8 -*-import unoimport datetimeimport reimport osCARD_DATA = '/data/number_cardid.csv'class Bridge(object):def __init__(self):self._context = XSCRIPTCONTEXT.getComponentContext()self._desktop = XSCRIPTCONTEXT.getDesktop()self._frame = self._desktop.CurrentFrameself._window = self._frame.ContainerWindowself._toolkit = self._window.Toolkitdef run_infodialog(self, title='', message=''):msgbox = self._toolkit.createMessageBox(self._window,'infobox', # ヒントアイコン1, # 「OK」ボタンtitle,message)msgbox.execute()msgbox.dispose()def run_querydialog(self, title='', message=''):msgbox = self._toolkit.createMessageBox(self._window,'querybox', # 疑問符アイコン3, # 「はい」「いいえ」ボタンtitle,message)return msgbox.execute()def get_today(*args):doc = XSCRIPTCONTEXT.getDocument()sheet = doc.getSheets().getByName('Main')dt_now = (datetime.datetime.now()).strftime('%Y/%m/%d')kaisai_nengetsu = sheet.getCellRangeByName('C3')if kaisai_nengetsu.String:msg_box = Bridge()res = msg_box.run_querydialog(title='開催年月日セット', message='すでに値がセットされています。\n上書きでセットしますか?')if res != 2: # 「はい」でなければ終了(res=2 はい res=3 いいえ)returnkaisai_nengetsu.String = dt_nowdef load_card_all(*args):doc = XSCRIPTCONTEXT.getDocument()sheet = doc.getSheets().getByName('Card')if not os.path.isfile(CARD_DATA):msg_box = Bridge()msg_box.run_infodialog(title='ファイルエラー', message='ファイルが存在しません\n' + CARD_DATA)returnf = open(CARD_DATA)lines = f.readlines()f.close()i = 0;for line in lines:list = re.split("\|\|", line.rstrip('\n'))card = sheet.getCellByPosition(0, i)id = sheet.getCellByPosition(1, i)card.Value = list[0]id.String = list[1]i += 1
窓の大きさとかは他の方のブログを見ると、設定はできるのに無視されるようだ。
つーか、LibreOffice(OpenOffice.org も)の Python マクロについて書かれた本って無いのね。
まあ、マニアックなネタだからな(笑)
<追記>
エラーダイアログは「infobox」ではなく「errorbox」だよね。
ダイアログ表示関数にメッセージタイプも渡すように修正してもいいが、エラーはエラーで別関数を用意した方がソース的にはわかりやすいかな?