前提
Pythonにて、フォルダを指定した後、複数画像(.jpg)を、pdfに変換するアプリを作成しています。
出力したpdfのファイル名をうまく設定できず、エラーが発生してしまいます。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
・「参照」ボタンにて取得したフォルダ内の画像を、まとめてpdfにする
・出力するファイル名を、「フォルダ名.pdf」のように名前を変更したい。
発生している問題・エラーメッセージ
エラーメッセージ PS C:\Users\sawad> & C:/Users/sawad/AppData/Local/Programs/Python/Python310/python.exe c:/Users/sawad/AppData/Local/Programs/Python/python_lesson/jikkou1.py Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\sawad\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "c:\Users\sawad\AppData\Local\Programs\Python\python_lesson\jikkou1.py", line 18, in pdfchange pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" ) UnboundLocalError: local variable 'iDirPath1' referenced before assignment
該当のソースコード
Python
1import os 2import tkinter as tk 3from tkinter import * 4from tkinter import ttk 5from tkinter import filedialog 6import img2pdf 7 8# フォルダ指定の関数 9def dirdialog_clicked(): 10 iDir1 = os.path.abspath(os.path.dirname(__file__)) 11 iDirPath1 = filedialog.askdirectory(initialdir = iDir1) 12 entry1.set(iDirPath1) 13 14#変換ボタン押下時の実行関数 15def pdfchange(): 16 #出力するpdfのファイル名 17 pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" ) 18 #pdfにしたい画像のあるフォルダを指定する 19 iDirPath1 = entry1.get() 20 21 #変換したい画像の拡張子 22 ext = ".jpg" 23 24 #「path」のある(カレント)フォルダを指定する 25 os.chdir(iDirPath1) 26 file_list = [i for i in os.listdir(iDirPath1) if i.endswith(ext)] 27 with open(pdfFileName, "wb") as f: 28 f.write(img2pdf.convert(sorted(file_list), title='Test PDF', viewer_page_layout=img2pdf.parse_layout('single'))) 29 30if __name__ == "__main__": 31 32 # rootの作成 33 root = Tk() 34 root.title("PDF変換ツール") 35 36 # Frame1の作成 37 frame1 = ttk.Frame(root, padding=10) 38 frame1.grid(row=0, column=1, sticky=E) 39 40 # 「フォルダ参照」ラベルの作成 41 IDirLabel = ttk.Label(frame1, text="フォルダ参照>>", padding=(5, 2)) 42 IDirLabel.pack(side=LEFT) 43 44 # 「フォルダ参照」エントリーの作成 45 entry1 = StringVar() 46 IDirEntry = ttk.Entry(frame1, textvariable=entry1, width=30) 47 IDirEntry.pack(side=LEFT) 48 49 # 「フォルダ参照1」ボタンの作成 50 IDirButton = ttk.Button(frame1, text="参照", command=dirdialog_clicked) 51 IDirButton.pack(side=LEFT) 52 53 # Frame2の作成 54 frame2 = ttk.Frame(root, padding=10) 55 frame2.grid(row=2, column=1, sticky=E) 56 57 # Frame3の作成 58 frame3 = ttk.Frame(root, padding=10) 59 frame3.grid(row=5,column=1,sticky=W) 60 61 # キャンセルボタンの設置 62 button2 = ttk.Button(frame3, text=("閉じる"), command=quit) 63 button2.pack(fill = "x", padx=30, side = "left") 64 65 # 実行ボタンの設置 66 button3 = ttk.Button(frame3, text="変換", command=pdfchange) 67 button3.pack(fill = "x", padx=30, side = "left") 68 69 root.mainloop()
試したこと
ここに問題に対して試したことを記載してください。
17行目の下記の部分を
pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" )
から、
pdfFileName = "output.pdf"
のような直接ファイル名を指定すると、「output.pdf」として出力は成功するのですが、、
ファイル名をどうにかフォルダ名にして出力したいです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
> UnboundLocalError: local variable 'iDirPath1' referenced before assignment
上記エラーは'iDirPath1'という変数を提示する前に参照しているので発生しています。それとは別に、「出力するファイル名を、「フォルダ名.pdf」のように名前を変更したい。/ファイル名をどうにかフォルダ名にして出力したいです。」とありますが、それだとフォルダに複数画像がある場合には上書きしてしまうかと思うのですが、その仕様で良いのでしょうか?
申し訳ございませんが、私では意味が理解できず、、
ベストアンサーの通りに修正して動かしてみたところちゃんと動きまして、もう一度実行すると、フォルダ内のpdfファイルが同じものに書き換えられるということでしょうか。それについては特に問題ありません。
「まとめてpdfにする」の部分を見落としていました。フォルダ内の画像全てを1つのPDFファイルに変換して出力する、ということだったのですね。失礼しました。

回答1件
あなたの回答
tips
プレビュー