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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

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

Python

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

Q&A

解決済

1回答

1521閲覧

pythonをvscで作成中、vscで実行すると画像がほぼ100%開かないです。助けてください。

sib

総合スコア6

Tkinter

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

Python

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

1グッド

0クリップ

投稿2021/06/05 06:04

編集2021/06/05 06:22

pythonをvscで作成中、vscで実行すると画像がほぼ100%開かないです。

相対パスや絶対パスでも上手くいかなくなりました。以下にそのエラー文を示します。

File "C:\Users\jjjteor\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 4009, in __init__ self.tk.call(('image', 'create', imgtype, name,) + options) _tkinter.TclError: couldn't open "img6/chap6-mapfield.png": no such file or directory

VSCを閉じてファイル名からプログラムの実行には成功します。相対パス、絶対パス共に成功します。

使用環境は windows10 、python3.9.5 64-bit、VSCの更新は無かったです。

調べても情報が無いので、参考になるサイトやエディタを変えた方が良い等、教えてください。

https://teratail.com/questions/90994?link=qa_related_pc_sidebar
↑も見つけましたが、私の友人のMacではVSCでも動くみたいです。

teamikl👍を押しています

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

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

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

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

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

jbpb0

2021/06/05 14:20 編集

> 絶対パスはエクスプローラーでコピーして使用してます。 パス内の\から/にした所、VSC上で絶対パスの状態での実行については、実行が出来ました。 WindowsのPythonで、パス区切り文字に「\」を使う場合は、たとえば "C:\Users\jjjteor" ではダメで、下記のどちらかにする必要がありますけど、そこは大丈夫でしょうか? "C:\\Users\\jjjteor" r"C:\Users\jjjteor" 参考 https://cocodrips.hateblo.jp/entry/2015/07/19/120028
sib

2021/06/05 13:59

ご指摘ありがとうございます。 正確には、¥ではなく、逆向きの/でした。入力がうまく出来なかったので、同等の意味を持っていると浅い知識で使ってました。 すみません。おそらくですが、そこは問題ないと考えてます。 知らない知識を教えて頂きありがとうございます。
jbpb0

2021/06/05 14:16 編集

> ¥ではなく、逆向きの/ そのどちらの表示がされていても、私のコメントのようにする必要があります https://support.lenovo.com/jp/ja/solutions/ht055624 (バックスラッシュは「逆向きの/」のことです)
sib

2021/06/05 14:18

自分が分かってないようですみません。以下の感じで使用してますが、 "C://Users/jjjteor" ↓の方が良い感じですか? "C://Users//jjjteor”
jbpb0

2021/06/05 14:30

> "C://Users/jjjteor" 「/」(スラッシュ)を使う場合は一つです "C:/Users/jjjteor" とします 二つ並べるのはバックスラッシュを使う場合です バックスラッシュは、環境によって、「/」の逆向きに見えることも、円マークに見えることもあります > パス内の\から/にした所、VSC上で絶対パスの状態での実行については、実行が出来ました。 と書かれてたので、バックスラッシュを二つ並べてなかったから絶対パスでもダメだったのではないか、と思って指摘しました
sib

2021/06/05 14:36

ありがとうございます。 間違って使ってました。 バックスラッシュは使い方を知らなかったので避けており、勉強になりました。
jbpb0

2021/06/05 14:37

「/」(スラッシュ)は一つで、バックスラッシュ(「/」の逆向き、または円マーク)は二つ並べるのは、絶対パス・相対パスのどちらも共通です
sib

2021/06/05 15:11

↓の文の使い方がわからないです。すみません。 os.chdir(os.path.dirname(os.path.abspath(__file__)))
jbpb0

2021/06/05 23:02 編集

実行したいPythonコードファイルの先頭の方に、 import os と、それを追記します その行が実行されると、カレントディレクトリが、そのファイルが置いてあるディレクトリに変わります 相対パスの基準はカレントディレクトリなので、相対パスが指す先が環境によらず同じになります
jbpb0

2021/06/05 22:58

たとえば、質問者さんが書いたPythonコードを他人に渡したとして、渡された人が実行する環境の設定がちゃんとされてないと、この質問のようなことが起きますが、上記対策をすれば、それが防止できます また、質問者さんが、将来実行環境をVS Code以外のものに変更することになった場合に、上記対策をすれば、今回の解決策と同様な設定方法を調べて設定する必要がなくなります もちろん、それぞれの実行環境で正しく設定するのが正攻法ですが、それが難しい場合もありますので、代用策として知っておくと、役に立つかもしれません
sib

2021/06/06 02:22

なるほどです。とてもメリットに感じました。ありがとうございます。とても勉強になりました。
guest

回答1

0

ベストアンサー

  • os.path.exists でファイルの存在チェックには成功しますか?
  • 実行時のカレントディレクトリの設定はどのようになってるのでしょう?

VSCの設定: launch.json ファイルがある場合、
該当する構成の "cwd": ... ... cwd がある場合、
実効時のターミナルに cd ... & python ~ で別のディレクトリへの移動が確認できます。

実行時に確認

python

1print(os.getcwd())

考えられる原因としては、VSC から実行した場合の作業ディレクトリのpathが違っている場合、
「相対パス」なら実行環境の path による違いは考えられます。

「絶対パス」で上手くいかないケースは心当たりがありません。
テストの仕方に不備があった等も疑わなくてはいけなくなってきます。

「絶対パス」は、os.path.abspath で、スクリプトの場所から構築しましたか?
それとも、文字列で直接記述でしょうか。(その場合は path をコピーしたか手打ちで編集か)

VSCを閉じてファイル名からプログラムの実行には成功します。

VSC 外で、コマンドプロンプトからコマンドを打ちこんでの実行はどうなりますか?
VSC 内からの実行時にターミナルに表示されるコマンドと比べて見て下さい。


他の確認点

  • ディレクトリ構成
  • VSCの設定 (.vscode settings.json, launch.json)
  • 実行方法: launch.json の有無と「デバッグの開始」「デバッグ無しで実行」

 launch.json がある場合は、どの構成で実行しているか

  • python のコード

VSC/python拡張のlauncher 経由で実行の場合は、
path に空白や日本語が含まれていないか、
ユーザー名が path に含まれる場合等も念のために確認。


関連

 ※ 同じ様なケースですが、絶対パスでは成功してます

投稿2021/06/05 09:56

編集2021/06/05 23:44
teamikl

総合スコア8760

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

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

sib

2021/06/05 11:48

ご丁寧のご回答ありがとうございます。 絶対パスはエクスプローラーでコピーして使用してます。 パス内の\から/にした所、VSC上で絶対パスの状態での実行については、実行が出来ました。
sib

2021/06/05 11:52

VSC 外で、コマンドプロンプトからコマンドを打ちこんでの実行はどうなりますか? 特に変わりなく動きました。 実行している文は、 import tkinter # ウィンドウ作成 root = tkinter.Tk() root.title("勇者求む!") root.minsize(640, 480) root.option_add("*font", ("メイリオ", 14)) # 画像読み込み img1 = tkinter.PhotoImage(file = "img4/chap4-1-1.png") # キャンバス作成 canvas = tkinter.Canvas(root, width=640, height=480) canvas.place(x=0, y=0) canvas.create_image(320, 220, image=img1, tag="illust") root.mainloop() という簡単な表示プログラムです。
sib

2021/06/05 11:54

関連の所で張って下さったリンクとほぼ似た状態です。 ですが、相対パスが出来ないのが何ともやるせないです。
sib

2021/06/05 12:00

os.path.exists でファイルの存在チェックには成功しますか? 実行時のカレントディレクトリの設定はどのようになってるのでしょう? 調べて実行した所問題ない感じです。
teamikl

2021/06/05 12:01

VSC での実行時にVSC内のターミナルに、python.exe を実行する時のコマンドを確認できませんか? そこで、作業ディレクトリを移動してるのではないかなという懸念があります。 import os print(os.getcwd()) をスクリプト内に入れて、「VSC内で実行」「VSC外で実行」で比べて見て下さい
teamikl

2021/06/05 12:18

絶対パスでの読込が成功したのなら 他の解決案: 絶対パスに変換する関数を作っておく方法もあります path = os.path.abspath(os.path.join(os.path.dirname(__file__), "img6/chap4-1-1.png")) 例えば、実行ファイルを作ったりする際は、 組み込みリソースのpath を実行時に所得する必要がある為、 相対パスでソースの各処に点在させるよりも、 相対パス→絶対パスに変換しておく事に利点はあります。
sib

2021/06/05 12:26

VSC内では、C:\Users\jjjteor VSC外では、C:\Users\jjjteor\OneDrive\デスクトップ\課題入れ\4年\授業\ゼミ\python\python でした。
sib

2021/06/05 12:30

他の解決案で実行した所、画像が表示されないですがプログラムは実行出来ました。
teamikl

2021/06/05 12:34

相対パスだと C:\Users\jjjteor\img6/chap4-1-1.png を読み込みに行く事になりますね。 VSC 側の設定の確認ですが、.vscode/lunch.json ファイルはありますか? >画像が表示されないですがプログラムは実行出来ました。 これは多分、よくある類似の症状があって ローカル変数にPhotoImageを格納していて、破棄された為だと思います。 実際のコード次第ですが、修正可能です。
sib

2021/06/05 12:50

VSC 側の設定の確認ですが、.vscode/lunch.json ファイルはありますか? すみません。調べ方を調べたんですけどわかりません。
sib

2021/06/05 12:52

つまり、VSCでは、違う所で相対パスが通っているということですか
teamikl

2021/06/05 12:59

相対パスの基準となるディレクトが異なる為ですね。 調べ方は、VSC内左側、プロジェクト内のファイル一覧の所にあるはずですが、 .vscode ディレクトリは非表示になっている可能性はあります。 lunch.json があれば、JSON に "cwd": "${fileDirname}" (cwd は change working directory) を追加することで設定できます。 lunch.json が構成されてない場合もあるので、先に確認を取った方が良いです。
sib

2021/06/05 13:08

すみません。 プロジェクト内のファイル一覧の所がわからないです。 開いているエディターのことですか?
teamikl

2021/06/05 13:23

VSC内の左側です。環境によって画面構成が違ってる可能性もありますね。 その前に確認ですが、VSC の Python 拡張機能はインストールされてますか?
sib

2021/06/05 13:39

拡張機能の所には、python、pylance、jupyter、c#があります。 pythonの中の詳細には、Python extension for Visual Studio Codeと書いてあります。
teamikl

2021/06/05 13:44

VSCのメニューから実行 → 構成を開く で確認できるようです。 ない場合。 実行→構成を追加→Python→Python File エディタ画面に lunch.json ファイルが開かれるので "console" の下に "cwd" を追加。末尾のカンマには注意。ファイルを保存し、 VSCのステータスバーの左から3番目で、作成した構成を選択します。 lunch.json の編集箇所の参考に https://logixsquare.com/techblog/visual-studio-code-python-version-settings/
sib

2021/06/05 13:54

VSCのメニューから実行 → 構成を開く で透明でクリック出来なかったので、ないと思います。
teamikl

2021/06/05 14:00

ない場合は作成する必要があります。 ---- 他、VSC の設定で関連のありそうな場所。念の為確認 自分の環境(win10)では、空欄で Split Cwd のみ inherited でした。 「ファイル」「ユーザー設定」「設定」 「ユーザー」もしくは「ワークスペース」で "cwd" を検索 Terminal integrated: Split Cwd inherited: 分割ターミナル MacOS と Linux では、新しい分割ターミナルは親ターミナルの 作業ディレクトリを使用します。Windows では、初期の動作と同じになります。
sib

2021/06/05 14:06

自分の環境(win10)では、空欄で Split Cwd のみ inherited でした。 私も同じ感じです。 作成してみます。
teamikl

2021/06/05 14:48 編集

そちらの設定は影響なさそうですね。 因みに、私の環境では launch.json ファイルは無くても正常に相対パスが使えました。 もう一つ懸念があるとすれば、 path に日本語が含まれる点でしょうか。 注意もう一点 (VSCの設定 launch.json で) "cwd": "t:\tkinter" みたいにすると \t がタブ文字と解釈されたので "cwd": "t:\tkinter" とする必要がありました。
sib

2021/06/05 14:21

VSCのメニューから実行 → 構成を開く で確認できるようです。 ない場合。 実行→構成を追加→Python→Python File エディタ画面に lunch.json ファイルが開かれるので "console" の下に "cwd" を追加。末尾のカンマには注意。ファイルを保存し、 VSCのステータスバーの左から3番目で、作成した構成を選択します。 lunch.json の編集箇所の参考に https://logixsquare.com/techblog/visual-studio-code-python-version-settings/ ここで質問です。 実行→構成を追加→Python→Python File とならずに 実行→構成を追加→VSC内のsetting.jsonのエディタが開きます。
sib

2021/06/05 14:23

setting.jsonの中身は以下です。 { "files.autoSave": "afterDelay", "editor.tabSize": 2, "editor.wordWrap": "on", "editor.fontFamily": "Ricty Diminished", "workbench.colorTheme": "Visual Studio Light", "workbench.editorAssociations": [ { "viewType": "jupyter.notebook.ipynb", "filenamePattern": "*.ipynb" } ], "launch": { "configurations": [ ] } }
sib

2021/06/05 14:25

相対パスは、 img6/chap6-mapfield.png だけでも問題な感じですか?
sib

2021/06/05 14:28

↑の補足です。日本語が絶対パスの際には入るので
teamikl

2021/06/05 23:48 編集

VSCのバージョンで仕様が変わったのかな。。 見た感じでは "launch" -> "configurations" 内に追加っぽいですが、 公式のドキュメントを参照して To create a launch.json file, click the create a launch.json file link in the Run start view. https://code.visualstudio.com/docs/editor/debugging launch.json ファイルが無い状態で実行しようとすると、 何かメニューがでるはずです。そこに create launch.json はないでしょうか (ドキュメントでの例は node ですが、pythonでも同じはず)
teamikl

2021/06/05 14:47 編集

>相対パスは、 img6/chap6-mapfield.png だけでも問題な感じですか? これ自体は問題なしです。 VSC で実行した際の作業ディレクトリが、 スクリプトファイルの場所と違うという実行環境の問題です。 解決策として提示している方法では、(launch.json に "cwd" を設定) 作業ディレクトリを想定の場所に移動してから実行できます。
sib

2021/06/05 14:58

lunch.json出来ました!!VSC内で実行できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問