質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

解決済

複数画像(.jpg)を、pdfに変換するアプリを作成したい。

sawawawa
sawawawa

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0グッド

0クリップ

283閲覧

投稿2022/11/06 09:14

前提

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

meg_

2022/11/06 09:39 編集

> UnboundLocalError: local variable 'iDirPath1' referenced before assignment 上記エラーは'iDirPath1'という変数を提示する前に参照しているので発生しています。それとは別に、「出力するファイル名を、「フォルダ名.pdf」のように名前を変更したい。/ファイル名をどうにかフォルダ名にして出力したいです。」とありますが、それだとフォルダに複数画像がある場合には上書きしてしまうかと思うのですが、その仕様で良いのでしょうか?
sawawawa

2022/11/06 10:40

申し訳ございませんが、私では意味が理解できず、、 ベストアンサーの通りに修正して動かしてみたところちゃんと動きまして、もう一度実行すると、フォルダ内のpdfファイルが同じものに書き換えられるということでしょうか。それについては特に問題ありません。
meg_

2022/11/06 11:31

「まとめてpdfにする」の部分を見落としていました。フォルダ内の画像全てを1つのPDFファイルに変換して出力する、ということだったのですね。失礼しました。

回答1

0

ベストアンサー

中身をちゃんと見ていませんが、少なくとも以下の場所で「iDirPath1」に値を入れる前に、basenameで参照しているのが問題です。

python

1 #出力するpdfのファイル名 2 pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" ) 3 #pdfにしたい画像のあるフォルダを指定する 4 iDirPath1 = entry1.get()

また、どうやら、「iDirPath1」はディレクトリ名のようです。 ディレクトリ名のbasenameを取って、それに「.pdf」を付けてそれをファイル名にしようとしているように見えます。それはおかしいですね。
どういうファイル名にしたいのですか?たぶん、「ディレクトリ名」+ 「ファイル名の拡張子以外」+「.pdf」としたいのだと思いますが、 ディレクトリ名は iDirPath1として、ファイル名の拡張子以外のところは何ですか?

投稿2022/11/06 09:33

編集2022/11/06 09:38
TakaiY

総合スコア10467

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

sawawawa

2022/11/06 09:49

おおお! うまく動作しました! 本当にありがとうございます!! 私はプログラミング初心者のため、うまく答えられないですが、、 ご認識の通り、「iDirPath1」はディレクトリ名です。 「参照」ボタンで取得したフォルダ名のところに入っている画像をpdf形式に変換し、「ディレクトリ名」+「.pdf」にしたかったので、目的はこれであっております。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。