実現したいこと
複数の画像を一度の操作で背景を削除できるGUIを使ったソフトを作りたい
前提
複数の画像を一度の操作で背景を削除することができるGUIを使ったソフトを開発していましたが、グローバル変数の箇所が以下のようなエラーになりました。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "(プログラムのあるパス)", line 54, in <module> for file in in_files: NameError: name 'in_files' is not defined
該当のソースコード
Python
1import cv2, os, sys 2from rembg import remove 3import tkinter as tk 4from tkinter import ttk, filedialog, messagebox 5 6def file_select(): 7 type = [('BMPファイル(.bmp)', '*.bmp'), ('PNGファイル(.png)', '*.png'), ('JPEGファイル(.jpg, .jpeg)', '*.jpg', '*.jpeg')] 8 dir = os.getcwd() 9 global in_files 10 in_files = filedialog.askopenfilenames(title="ファイルを選択してください。", initialdir=dir, filetypes=type) 11 12def save_dir_select(): 13 idir = os.getcwd() 14 global save_dir 15 save_dir = filedialog.askdirectory(initialdir=idir) 16 17def start_clicked(): 18 # 入力と出力のファイル名を指定 19 output_name = os.path.splitext(os.path.basename(in_files))[0] 20 output_ext = os.path.splitext(in_files) 21 output_path = os.path.join(save_dir, f'{output_name}_removed.{output_ext}') 22 23 if in_files is None: 24 messagebox.showwarning("警告", "ファイルがありません。") 25 26 # 実際の処理 27 input = cv2.imread(in_files) 28 output = remove(input) 29 cv2.imwrite(output_path, output) 30 31 # 終了したことを知らせる 32 messagebox.showinfo("完了", "処理が完了しました。") 33 34if __name__ == '__main__': 35 root = tk.Tk() 36 root.title = "画像背景一括削除" 37 # frame1の生成 38 frame1 = ttk.Frame(root) 39 frame1.pack(side=tk.LEFT) 40 # ファイル一覧の作成 41 column = ('ファイル名', 'パス') 42 # 表の作成 43 tree = ttk.Treeview(root, columns=column) 44 # 列の設定 45 tree.column('#0', width=0, stretch='no') 46 tree.column('ファイル名', anchor='w') 47 tree.column('パス', anchor='w') 48 # 見出しを設定 49 tree.heading('#0', text='') 50 tree.heading('ファイル名', text='ファイル名', anchor='w') 51 tree.heading('パス', text='パス') 52 53 # 内容を追加 54 for file in in_files: 55 tree.insert(parent='', index='end', values=(os.path.basename(file), file)) 56 57 # frame2の生成 58 frame2 = ttk.Frame(root) 59 frame2.pack(side=tk.LEFT) 60 # 開くボタンの生成 61 open_button = ttk.Button(frame2, text='開く', command=file_select) 62 open_button.pack(tk.LEFT) 63 # 保存場所のテキストボックスを設置 64 text = ttk.Label(frame2, text='保存場所') 65 text.pack(side=tk.LEFT) 66 # 参照ボタンの設置 67 save_dir_button = ttk.Button(frame2, text='保存', command=save_dir_select) 68 save_dir_button.pack(side=tk.LEFT) 69 70 # frame3の設置 71 frame3 = ttk.Frame(root) 72 frame3.pack(side=tk.LEFT) 73 # 実行、キャンセルボタンの設置 74 execute_button = ttk.Button(frame3, text='実行', command=start_clicked) 75 execute_button.pack(side=tk.LEFT) 76 cancel_button = ttk.Button(frame3, text='キャンセル', command=sys.exit) 77 cancel_button.pack(side=tk.LEFT) 78 progressbar = ttk.Progressbar(frame3, mode="indeterminate") 79 progressbar.pack(side=tk.LEFT)
試したこと
グローバル変数以外の方法でファイルを読み込ませようと考えましたが、それは難しいとの結論になりました。
また、このコードの前に、「if name == 'main':」以下のものを関数化していましたが、今のようなコードにしてみました。
補足情報(FW/ツールのバージョンなど)
OS:Windows 10 64ビット 22H2 OSビルド 19045.3031
Python:Anaconda 2023.03
エディター:Visual Studio Code バージョン 1.78.2
使用したライブラリ:OpenCV, os, rembg, sys, tkinter
回答1件
あなたの回答
tips
プレビュー