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

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

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

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

Q&A

解決済

1回答

1657閲覧

【Python】ミスタースティックマンゲームで背景画像を表示させたい

born

総合スコア9

Python

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

0グッド

0クリップ

投稿2020/05/02 12:26

編集2020/05/02 15:40

前提・実現したいこと

参考書に書いてあるゲームを作っているところなのですが、参考書の通りに記述してもエラーが表示されてしまいます。参考書には今の段階で背景画像が表示されると書かれているのですが、表示されません。

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

python

1Traceback (most recent call last): 2 File "C:/Users/Name/AppData/Local/Programs/Python/Python38-32/stickmangame.py", line 36, in <module> 3 g = Game() 4 File "C:/Users/Name/AppData/Local/Programs/Python/Python38-32/stickmangame.py", line 17, in __init__ 5 self.bg = PhotoImage(file="background.gif") 6 File "C:\Users\Name\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 4061, in __init__ 7 Image.__init__(self, 'photo', name, cnf, master, **kw) 8 File "C:\Users\Name\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 4006, in __init__ 9 self.tk.call(('image', 'create', imgtype, name,) + options) 10_tkinter.TclError: couldn't open "background.gif": no such file or directory 11

該当のソースコード

from tkinter import * import random import time class Game: def __init__(self): self.tk = Tk() self.tk.title("ミスタースティックマンの脱出") self.tk.resizable(0, 0) self.tk.wm_attributes("-topmost", 1) self.canvas = Canvas(self.tk, width=500, height=500, highlightthickness=0) self.canvas.pack() self.tk.update() self.canvas_height = 500 self.canvas_width = 500 root = tkinter.Tk() self.bg = PhotoImage(file="background.gif", master=root) w = self.bg.width() h = self.bg.height() for x in range(0, 5): for y in range(0, 5): self.canvas.create_image(x * w, y * h, image=self.bg, anchor='nw') self.sprites = [] self.runnning = True def mainloop(self): while 1: if self.running == True: for sprite in self.sprites: sprite.move() self.tk.update_idletasks() self.tk.update() time.sleep(0.01) g = Game() g.mainloop()

試したこと

解答と見比べた
同様の質問がないか調べた

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

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

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

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

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

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

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

Yasumichi

2020/05/02 12:53

background.gif は、同じ階層に存在するのですかね?
born

2020/05/02 14:46

もしかして同じフォルダに存在するだけでは同じ階層に存在するとは言えないのでしょうか? 仮にそうだとした場合、どうやって階層をそろえればよいでしょうか? 最近始めたばかりでまだまだ知識が足りないので、お手数をおかけしますが、教えていただけると幸いです。
teamikl

2020/05/02 16:50

同じエラーは再現しませんでした。幾つか修正しないと他の箇所で止ります。 > 同じフォルダに存在するだけでは同じ階層に存在する ファイルは存在するけど上記のエラーとなってる場合、 このコードのファイル指定では、厳密には 「Pythonファイルと同じ場所」という意味ではなく、 「プログラムを実行した場所」となる点に注意です。 そのフォルダ内から実行の場合、双方は同じ場所を指しますが、 別の場所から実行した場合は、正しく画像ファイルを参照できません。
guest

回答1

0

ベストアンサー

(備忘録)[Python + tkinter] tk.PhotoImage でエラーが出る - Qiita

これと同じ現象では、ないでしょうか?

【追記】
エラーメッセージが異なっているのでファイル名が違っている可能性があります。

投稿2020/05/02 15:10

編集2020/05/02 23:36
Yasumichi

総合スコア1773

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

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

born

2020/05/02 15:25

回答ありがとうございます。そちらのサイトの真似をして、fill=~のところに「master=root」や「master=frame」を挿入してみましたが、やはり改善されませんでした。挿入部分を間違えてしまっているのでしょうか?
Yasumichi

2020/05/02 15:35 編集

真面目に動かしてなかったので調べます。
Yasumichi

2020/05/02 15:37

root の部分は、tk.Tk() または tkinter.Tk() で初期化されている変数です。
born

2020/05/02 15:44

すみません、本当にはじめてまもなくですので、初期化などの言葉もあまり理解できていませんので、現在のコードを更新して載せましたので、何か間違っているところはないか確認していただけないでしょうか?
Yasumichi

2020/05/02 16:13 編集

1 root = tkinter.Tk() の行は、削除します。 2 次の PhotoImage 使っている行は、以下のように修正します。(インデントはそのまま) self.bg = PhotoImage(file="background.gif", master=self.tk) 3 おまけ self.runnning = True は、 self.running = True とします。  (あとの if 文で比較しているところより、n が1文字多いです。 ) まだ、バグがありそうですが、これで画像が表示できないですかね。これでダメなら画像ファイル名をもう一度、確認した方が良いです。 あと、著作権問題がありそうなので出典を明らかにして、コードを関係のある一部に絞った方がいいかもです。
Yasumichi

2020/05/02 16:14

↑画像名間違えてたので修正しました。既にコメント読んでたら、修正してください。
Yasumichi

2020/05/02 23:34

よく見るとエラーメッセージが違っていました。
born

2020/05/03 03:26

teamiklさんが貼ってくださったurlから著者の方のサイトへ飛び、自分の現在のコードと照らし合わせて確認して修正をしてみましたが、やはり改善しません。 上でおっしゃられた通り、階層が違っているのか、または背景画像の保存に何か間違いがあるのではないかと思いました。 そこで一から作り直そうと思うのですが、背景画像を保存しているフォルダにプログラムを保存するにはどうすればよいのでしょうか? 私は new file→名前を付けて保存→デスクトップ→stickman(背景画像を保存している場所)→stickmangame.pyと名前を付けて保存 の通りにやっていました。
Yasumichi

2020/05/03 03:45

個人的には、背景画像の方をプログラムがあるフォルダーへエクスプローラーでコピペで良いような。
born

2020/05/03 04:01

それだと背景画像以外の画像を読み込むときに困るかなと思いました。あとはこの参考書が背景画像があるフォルダにプログラムを保存している前提で話をしているみたいなので、この先の本の説明の際に困ってしまうかなとも思います。 ただ、もしその方法でこの先もやれそうであればそちらでやらせていただきます!
Yasumichi

2020/05/03 05:05

ああ、それらなら、プログラムの方を背景画像があるフォルダにコピーでも良いです。
born

2020/05/03 08:54

ずっと試していたんですが、どうにもうまくいきません おそらくディレクトリが異なることが原因だと突き止めたのですが、色々調べましたが、合わせ方がわかりません。 方法を教えていただけますでしょうか。
Yasumichi

2020/05/03 09:03

teamikl さんが、「質問への追記・修正」で書かれていますが、プログラムと画像が同じフォルダにあり、かつ、プログラムの実行する際のカレントディレクトリ(フォルダのこと)が同一になるように実行する必要があります。 例えば、プログラムと画像が C:/Users/Name/AppData/Local/Programs/Python/Python38-32/ にある場合、コマンドプロンプトで以下のように実行します。 > cd C:/Users/Name/AppData/Local/Programs/Python/Python38-32/ > python stickmangame.py フォルダ名は正しいものに変えてください。
born

2020/05/03 09:38

今background.gifがそもそも本当に正しいのかと確認したところ、「background.gif.gif」になってしまっていました。背景画像のファイル名が間違っていた、ということでした。こんな初歩的なミスに対して長くつき合わせてしまって本当に申し訳ございませんでした。Yasumichiさん、teamiklさんが色々を考えてくださったおかげで私も様々な視点で確認することを学ぶことができました。繰り返しになりますが、この度は本当にありがとうございました。二度とこういったミスをしないように気を付けます。
Yasumichi

2020/05/03 09:46

ミスは上級者にもあり得ますし、そこは気負わないでください。 割と書いた本人は、そこは間違ってないはずという思い込みがあったりするもので。 今回の経験を生かして、今後、問題に当たった時に落ち着いて、原点に帰ってみる、違う視点で見てみるようにするといいかもしれません。 なんて、余計なお世話かもしれませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問