前回、複数のファイルを選択するとき、ダイアログ上で好みの順番でファイルを選択したとしても、ファイル名で自動的にソートされてPDFファイルになるという問題がありました。たとえば「3.jpg、5.jpg、1.jpg、2.jpg」という順番で画像ファイルを選択したとしても、「1.jpg、2.jpg、3.jpg、5.jpg」という順番になってしまいます。
ですが、ファイル名の順番ではなく、自分の選んだ順番でPDFにしたいという要望もあると思います。この問題を解決するために、少しプログラムを改良してみました。
動作
前回同様、プログラムを実行するとファイルを選択するダイアログが表示されます。複数のファイルも選択できます。

「開く」ボタンを押すと以下のようなダイアログが開きます。

ここで「SELECT」というラベルの下にあるファイル名が付いたボタンを自分の好みの順番で押して行ってください。そうすると上の「ORDER」というラベルの下に、選択した順番でファイル名が表示されます。

選択後、Closeボタンを押すと少し間をおいて保存ダイアログが開きますので、PDFファイルを保存してください。

ソースコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import os from PIL import Image import tkinter as tk from tkinter import filedialog as fd def file_open_dialog(): rt = tk.Tk() rt.withdraw() filenames = fd.askopenfilenames(title="ファイルを選択してください", filetypes=[("Image file", ".bmp .png .jpg .tif"), ("Bitmap", ".bmp"), ("PNG", ".png"), ("JPEG", ".jpg"), ("Tiff", ".tif") ], initialdir = os.getcwd()) rt.destroy() return filenames def file_save_dialog(): rt = tk.Tk() rt.withdraw() filename = fd.asksaveasfilename(initialfile="myImages.pdf", title="ファイルを保存してください", filetypes=[("", ".pdf")]) rt.destroy() return filename def reorder_dialog(file_list): def append(widget, element, results, display): # append element to list results.append(element) # disable button widget['state'] = 'disabled' # add element to label current = display['text'] if current: current += '\n' display['text'] = current + os.path.basename(element) # create window root = tk.Tk() # list for correct order results = [] # label to display order tk.Label(root, text='ORDER').pack() ordered_list = tk.Label(root, anchor='w', justify='left') ordered_list.pack(fill='x', padx=10) # buttons to select elements tk.Label(root, text='SELECT').pack() for file in file_list: b = tk.Button(root, text=os.path.basename(file), anchor='w') b['command'] = lambda w=b, e=file, r=results, d=ordered_list:append(w, e, r, d) b.pack(fill='x', padx=10) # button to close window b = tk.Button(root, text='Close', command=root.destroy) b.pack(fill='x', pady=(15,0)) # start mainloop root.mainloop() return results # ファイルを選択する file_list = file_open_dialog() print(file_list) # ファイルの順序を入れ替える file_list = reorder_dialog(file_list) img_list = [] for f in file_list: print(f) try: img = Image.open(f) img = img.convert('RGB') img_list.append(img) except Exception as e: print(e.args) img = img_list.pop(0) # ファイルを保存する save_filename = file_save_dialog() if save_filename != "": img.save(save_filename, save_all=True, append_images=img_list) |
前回から追加したのは、reorder_dialog関数というファイルの順番を選択するダイアログの関数です。ちなみに今回のプログラムで追加した部分は、以下のサイトに書かれていた内容を参考にさせてもらっています。
- 投稿タグ
- プログラミング