LibreOffice の Python マクロでダイアログを使う

LibreOffice のマクロを Python で書いた場合の、「OK」ボタンが1つだけのダイアログボックスと、「はい」「いいえ」の選択肢のあるダイヤログボックスの使い方。
情報をググってみても、なんか「表示させるまで」の情報や、「OK」ボタン一個だけの場合の情報ばかりが多かったので、具体的な例をあげとこう。

a.セルに値をセットする時、すでに値がセットされていたら上書きするか確認表示

 20200613_dialog1.jpg

b.読み込むファイルが無い時、その旨をアラート表示

 20200613_dialog2.jpg

ソースは以下のとおり。(@ty21kyさんの Qiita の記事を参考に)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import uno
import datetime
import re
import os

CARD_DATA = '/data/number_cardid.csv'

class Bridge(object):

    def __init__(self):

        self._context = XSCRIPTCONTEXT.getComponentContext()
        self._desktop = XSCRIPTCONTEXT.getDesktop()
        self._frame = self._desktop.CurrentFrame
        self._window = self._frame.ContainerWindow
        self._toolkit = self._window.Toolkit

    def 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 いいえ)
            return

    kaisai_nengetsu.String = dt_now

def 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)
        return

    f = 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」だよね。
ダイアログ表示関数にメッセージタイプも渡すように修正してもいいが、エラーはエラーで別関数を用意した方がソース的にはわかりやすいかな?

 20200614_windows3.jpg

トラックバック(0)

このブログ記事を参照しているブログ一覧: LibreOffice の Python マクロでダイアログを使う

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/5633

コメントする

このブログ記事について

このページは、shinodaが2020年6月13日 20:51に書いたブログ記事です。

ひとつ前のブログ記事は「実はキング軒、初めてだった」です。

次のブログ記事は「Windows10 の「勝手に再起動」は実行された」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら