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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

443閲覧

Python GUI 複数の画像 背景削除 エラー

DjangoUser

総合スコア24

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/05/25 12:45

実現したいこと

複数の画像を一度の操作で背景を削除できる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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/05/25 12:54

コードをしっかりは見ていませんが、for file in in_files の方が先に実行されてませんか?
guest

回答1

0

自己解決

上記コメントに気づき、for file in in_files をファイル参照用の関数に移したら、うまくいきました。
ありがとうございました。

投稿2023/05/25 13:11

DjangoUser

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問