InDesignファイルバージョンの取得するツールのGUI版(wxPythonが必要)を作りました。
全体コード:https://github.com/mlove4u/InDesignFileVersion
import os
import csv
import wx
import wx.lib.mixins.listctrl as listmix
from InDesignFile import InDesignFile
class FileDropTarget(wx.FileDropTarget):
def __init__(self, parent):
wx.FileDropTarget.__init__(self)
self.parent = parent
def OnDropFiles(self, x, y, files):
self.parent.check(files)
return 0
class SortableListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
# listmix.ListCtrlAutoWidthMixin: 列の幅自動調整可能
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, -1,
style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
listmix.ListCtrlAutoWidthMixin.__init__(self)
#
self.parent = parent
self.sort_acend = True # 昇順
self.pre_column = None # 前回クリックした列の番号
#
self.Bind(wx.EVT_LIST_COL_CLICK, self.__sort)
def set_header(self, datas: list):
# datas: [(name:str, width:int),...]
# width:int == -1: 幅は自動
for i, x in enumerate(datas):
self.InsertColumn(i, x[0], width=x[1])
def set_datas(self, data):
self.items = data
self.__insert_datas()
def __insert_datas(self):
self.DeleteAllItems()
for i, x in enumerate(self.items):
self.InsertItem(i, x[0])
self.SetItem(i, 1, str(x[1])) # tuple to str
self.SetItem(i, 2, x[2])
if x[1] == (-1, -1):
self.SetItemTextColour(i, "Red")
def __sort(self, event):
col = event.GetColumn()
if col != self.pre_column: # 新しい列をクリックした場合、昇順に
self.sort_acend = True
self.pre_column = col
else:
self.sort_acend = not self.sort_acend
if self.sort_acend:
self.items.sort(key=lambda x: x[col])
else:
self.items.sort(key=lambda x: x[col], reverse=True)
self.__insert_datas()
class MyFrame (wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, id=-1, size=(600, 600),
title="Check InDesign File Version")
#
sbSizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "File extension"))
self.indd = wx.CheckBox(sbSizer.GetStaticBox(), -1, "indd")
self.indd.SetValue(True) # default: 一番よく使うinddをONに
self.indt = wx.CheckBox(sbSizer.GetStaticBox(), -1, "indt")
self.indb = wx.CheckBox(sbSizer.GetStaticBox(), -1, "indb")
self.indl = wx.CheckBox(sbSizer.GetStaticBox(), -1, "indl")
for obj in (self.indd, self.indt, self.indb, self.indl):
sbSizer.Add(obj, 0, wx.ALL, 5)
#
self.btn = wx.Button(self, -1, "Export as CSV")
#
self.table = SortableListCtrl(self)
self.table.SetDropTarget(FileDropTarget(self)) # drag&dropアリア
self.table_header = [("App Name", 170), ("Version", 60), ("File", -1)]
self.table.set_header(self.table_header)
#
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(sbSizer, 0, wx.ALL, 5)
main_sizer.Add(self.btn, 0, wx.ALIGN_RIGHT | wx.ALL, 5)
main_sizer.Add(self.table, 1, wx.ALL | wx.EXPAND, 5)
self.SetSizer(main_sizer)
self.Layout()
#
self.btn.Bind(wx.EVT_BUTTON, self.export_to_csv)
#
self.myInDesignFile = InDesignFile()
def __get_files_in_folder(self, folder, suffixs):
for root, _, files in os.walk(folder):
for f in files:
if (not f.startswith(".")) and f.lower().endswith(suffixs):
yield os.path.join(root, f)
def check(self, files):
objs = {".indd": self.indd, ".indt": self.indt,
".indb": self.indb, ".indl": self.indl}
suffixs = tuple([k for k in objs if objs[k].GetValue()])
#
results = []
files_to_check = []
for f in files:
if os.path.isfile(f):
if f.lower().endswith(suffixs):
files_to_check.append(f)
else: # フォルダの場合(ファイルとフォルダが混在する可能性)
for y in self.__get_files_in_folder(f, suffixs):
files_to_check.append(y)
for f in files_to_check:
# NOTE: このサンプルでは、fGUIDをチェックしない
r = self.myInDesignFile.get_version(f, check_fGUID=False)
version = (-1, -1) if r[0] == None else r[0]
results.append([r[1], version, f])
self.table.set_datas(results)
def export_to_csv(self, event):
# save csv to ~/Desktop/__result.csv
saveto = os.path.join(os.path.expanduser('~/Desktop'), "__result.csv")
with open(saveto, 'w', encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow([x[0] for x in self.table_header]) # header
for row in self.table.items:
writer.writerow(row)
if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()

