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

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

ただいまの
回答率

88.92%

クイズプログラムでのエラー

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 115

imbat_horta

score 0

前提・実現したいこと

自分で作ろうとしているクイズ形式のプログラムなのですが
実行すると以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "kime4.py", line 11, in <module>
    img = ImageTk.PhotoImage(file='hasira.png')
  File "C:\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 89, in __init__       
    image = _get_image_from_kw(kw)
    return Image.open(source)
  File "C:\Anaconda3\lib\site-packages\PIL\Image.py", line 2809, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'hasira.png'
Exception ignored in: <function PhotoImage.__del__ at 0x00000204BAC8D438>
Traceback (most recent call last):
  File "C:\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 118, in __del__       
    name = self.__photo.name
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

該当のソースコード

import tkinter as tk
from PIL import Image, ImageTk
from tkinter import PhotoImage

def raise_frame(frame):
    frame.tkraise()

root = tk.Tk()
root.title("テスト")

img = ImageTk.PhotoImage(file='hasira.png')

f1 = tk.Frame(root,width=680, height=480, bg="white")
label= tk.Label(f1, image=img).pack()
label1=tk.Label(f1, text="", font=("",30)).pack()
button1=tk.Button(f1, text="スタート", font=("",30), command=lambda:raise_frame(f2)).pack()

f2 = tk.Frame(root,width=680, height=480, bg="black")
label= tk.Label(f2, image=img).pack()
Label1 = tk.Label(f2, text="女性ですか?男性ですか? (1:男性、2:女性)", font=("",30), bg="white")
Label1.pack()

#ボタン配置
button = tk.Button(f2, text="男性", font=("", 24),command=lambda:raise_frame(f3)).pack(padx=200, side="left")
button1 = tk.Button(f2, text="女性", font=("", 24),command=lambda:raise_frame(f3)).pack(padx=200, side= 'right')


f3 = tk.Frame(root,width=680, height=480, bg="skyblue")
label2= tk.Label(f3, image=img).pack()
Label3 = tk.Label(f3, text="傷がありますか?", font=("",30), bg="white")
Label3.pack()
#ボタン配置
button = tk.Button(f3, text="ある", font=("", 24),command=lambda:raise_frame(f4)).pack(padx=200, side="left")
button1 = tk.Button(f3, text="ない", font=("", 24),command=lambda:raise_frame(f4)).pack(padx=200, side= 'right')


gyoumei = ImageTk.PhotoImage(file = "gyoumei.png")

f4 = tk.Frame(root,width=680, height=480, bg="red")
label5 = tk.Label(f4, text="", font=("",30))
label= tk.Label(f4, image=gyoumei).pack()
label5.pack()
button3 = tk.Button(f4, text='戻る', font=("",30), command=lambda:raise_frame(f1)).pack()

#f3 = tk.Frame(root,width=680, height=480, bg="red")
#button3 = tk.Button(f3, text='戻る', font=("",30), command=lambda:raise_frame(f1)).pack(fill = "both", padx=100, pady=200, expand=True)

for frame in (f1, f2, f3, f4):
    frame.grid(row=0, column=0, sticky='news')


raise_frame(f1)
root.mainloop()

試したこと

Googleなどで調べてもいまいちわからなかったのでなぜこうなってしまうのかこれを付け加えるとできるなどアドバイスがあればお願いします!

補足情報(FW/ツールのバージョンなど)

プログラムはpythonで使っているソフトはビジュアルスタジオコードです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

原因はFileNotFoundError: [Errno 2] No such file or directory: 'hasira.png'です。
カレントディレクトリに画像ファイルを配置してください。一般的にはkime4.pyと同じ場所でよいです。

以下のようなコードでファイルの存在確認ができます。

import os

img_path = 'hasira.png'
print( img_path, os.path.exists(img_path))
img_path = os.path.join( os.getcwd(), 'hasira.png') # getcwdはカレントディレクトリパスを返す
print(img_path, os.path.exists( img_path))
:

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/07 16:45

    回答ありがとうございます。 申し訳ないのですが
    kime4.pyと同じところにhasira.pngのファイルを入れて実行してみましたがエラー文が変わりませんでした。
    Traceback (most recent call last):
    File "kime4.py", line 11, in <module>
    img = ImageTk.PhotoImage(file='hasira.png')
    File "C:\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 89, in __init__
    image = _get_image_from_kw(kw)
    File "C:\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 58, in _get_image_from_kw
    return Image.open(source)
    File "C:\Anaconda3\lib\site-packages\PIL\Image.py", line 2809, in open
    fp = builtins.open(filename, "rb")
    FileNotFoundError: [Errno 2] No such file or directory: 'hasira.png'
    Exception ignored in: <function PhotoImage.__del__ at 0x00000201FB4FD438>
    Traceback (most recent call last):
    File "C:\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 118, in __del__
    name = self.__photo.name
    AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

    ソースコードの方では
    label= tk.Label(f1, image=img).pack()
    label1=tk.Label(f1, text="", font=("",30)).pack()
    button1=tk.Button(f1, text="スタート", font=("",30), command=lambda:raise_frame(f2)).pack()

    labelやbutton1などに赤い波線が引かれていました
    この赤い波線はエラー文と関係とかありますか?

    キャンセル

  • 2020/07/07 17:16

    回答に追記したコードで、ファイルが存在するか確認ください。
    VSCodeは使っていないので推測ですが、VSCode上からコードを実行すると、
    実行.pyファイルのある場所とカレントディレクトリが異なる場合がありえます。
    コマンドプロンプト上から「python kime4.py」と実行してみてください。

    とりあえず赤い波線はとりあえず関係ありません。

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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