Libreofficeのダイアログ画面上で一組の画像をアニメーションのように自動的に順次見せるAnimatedImageControlを使ってみた。
このAnimatedImageControlを使ったBasic言語による雛形はここにある。これをPythonに翻訳した。注意点は:
- insertImageSet(0, 画像ファイルパスの配列)というメソッドがある。Basic言語では画像ファイルパスの配列にはそのまま配列名を書く。Pythonでは画像ファイルパスの配列としてリストやタプルで構成することができるが、リストではダメでタプルで作ったものを使う。
- インポートしたモジュールで定義されている定数を実引数に使うメソッド、例えばsetPosSize(10, 10, 1000, 900, モジュール定義の定数)。Basic言語ではcom.sun.star.awt.PosSize.POSSIZEのように階層構造をそのまま書く。Pythonではunoモジュールで定義されいる関数を使う。つまりuno.getConstantByName(“com.sun.star.awt.PosSize.POSSIZE”)
【マクロ】
#coding: utf-8
import uno
import screen_io as ui
import unohelper
def python_macro_clipart_anim(*arg):
#
#シート
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets[0]
#データのある行数を調べる
sRange = sheet.getCellRangeByName("A1")
sCursor=sheet.createCursorByRange(sRange)
sCursor.collapseToCurrentRegion()
MaxDataRow = sCursor.Rows.Count-1
ui.Print(MaxDataRow)
items=[]
imageURLs=[]
for i in range(MaxDataRow):
item = sheet.getCellByPosition(0, i+1 ).String
filePath = sheet.getCellByPosition(1, i+1 ).String
#ui.Print(item)
#ui.Print(filePath)
items.append(item)
imageURLs.append(uno.systemPathToFileUrl(filePath))
imageURLsT=tuple(imageURLs)
#
#ダイアログ
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.getServiceManager()
dialogM = smgr.createInstance('com.sun.star.awt.UnoControlDialogModel')
# Size of DialogM
dlgWth = 500
dlgHgt = 400
dialogM.Width = dlgWth
dialogM.Height = dlgHgt
dialogM.Title = "クリップアート・アニーション"
#ダイアログの生成とモデルの登録
dialog = smgr.createInstance('com.sun.star.awt.UnoControlDialog')
dialog.setModel(dialogM)
#
#
animCtrlModel = smgr.createInstance('com.sun.star.awt.AnimatedImagesControlModel')
animCtrlModel.insertImageSet(0, imageURLsT)
animCtrlModel.StepTime = 1000
animCtrlModel.AutoRepeat = False
animCtrlModel.ScaleMode = 1
#アニメーション・コントロールの登録
animateCtrl = smgr.createInstance('com.sun.star.awt.AnimatedImagesControl')
animateCtrl.setModel(animCtrlModel)
#
dialog.addControl("animated", animateCtrl)
POSSIZE = uno.getConstantByName("com.sun.star.awt.PosSize.POSSIZE")
animateCtrl.setPosSize(10, 10, 1000, 900, POSSIZE)
#
#窓の生成そしてこの窓をダイアログ画面として使う
window = smgr.createInstance('com.sun.star.awt.Toolkit')
dialog.createPeer(window,None) # None : OK / none : NG
#
animateCtrl.startAnimation()
dialog.execute()
dialog.dispose()
属性StepTime=1000で個々画像を一秒間表示するはずだがこの値を変えて表示時間に変化はない。また属性AutoRepeat = Falseで一組の画像の表示は一度のはずだが繰り返し表示される。