質問するログイン新規登録
Python

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

Q&A

1回答

2696閲覧

Pythonでジャンケンゲームを作りましたが、エラーとなります。 tkinter.TclErrorが表示されます。解決方法を教示いただきたいです。

Risekorise

総合スコア1

Python

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

0グッド

0クリップ

投稿2024/05/05 02:16

0

0

実現したいこと

ジャンケンゲームを正常に作動させる
※ジャンケンゲームの最初のボードは表示されますが、グー、チョキ、パーの
ボタンを押すと、「勝ち」、「負け」、「あいこ」の表示がされず、エラーと
なります。これを改善したいです。

発生している問題・分からないこと

ジャンケンゲームの最初のボードは表示されますが、グー、チョキ、パーの
ボタンを押すと、「勝ち」、「負け」、「あいこ」の表示がされず、エラーと
なります。これを改善したいです。

エラーメッセージ

error

1PS C:\Users\User\Udemy> cd janken 2PS C:\Users\User\Udemy\janken> python janken_gui_class.py 3Exception in Tkinter callback 4Traceback (most recent call last): 5 File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__ 6 return self.func(*args) 7 File "janken_gui_class.py", line 78, in <lambda> 8 self.view.pa_button['command'] = lambda: self.judge(2) 9 File "janken_gui_class.py", line 83, in judge 10 self.view.display(enemy, result) 11 File "janken_gui_class.py", line 59, in display 12 self.enemy_label.configure(images=self.images) 13 File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1637, in configure 14 return self._configure('configure', cnf, kw) 15 File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1627, in _configure 16 self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) 17_tkinter.TclError: unknown option "-images" 18PS C:\Users\User\Udemy\janken>

該当のソースコード

import random import tkinter as tk from PIL import Image, ImageTk GU, CHOKI, PA = 'グー', 'チョキ', 'パー' hands = [GU, CHOKI, PA] WIN, DRAW, LOSE = "勝ち", "あいこ", "負け" rules = { (0, 0): DRAW, (0, 1): WIN, (1, 0): LOSE, (1, 0): LOSE, (0, 0): DRAW, (0, 1): WIN, (2, 0): WIN, (2, 1): LOSE, (0, 0): DRAW } class View: def __init__(self): self.gu_image = Image.open('img/gu.png').convert('RGB').resize((100, 100)) self.gu_image = ImageTk.PhotoImage(self.gu_image) self.choki_image = Image.open('img/choki.png').convert('RGB').resize((100, 100)) self.choki_image = ImageTk.PhotoImage(self.choki_image) self.pa_image = Image.open('img/pa.png').convert('RGB').resize((100, 100)) self.pa_image = ImageTk.PhotoImage(self.pa_image) self.images = [self.gu_image, self.choki_image, self.pa_image] self.gu_label = tk.Label(root, image=self.gu_image) self.gu_label.place(x=20, y=200) self.choki_label = tk.Label(root, image=self.choki_image) self.choki_label.place(x=160, y=200) self.pa_label = tk.Label(root, image=self.pa_image) self.pa_label.place(x=300, y=200) self.gu_button = tk.Button(root, text='グー') self.gu_button.place(x=50, y=320) self.choki_button = tk.Button(root, text='チョキ') self.choki_button.place(x=190, y=320) self.pa_button = tk.Button(root, text='パー') self.pa_button.place(x=340, y=320) self.enemy_label = tk.Label(root, image=self.gu_image) self.enemy_label.place(x=160, y=20) self.text_label = tk.Label(root, text='最初はグー!じゃんけん!') self.text_label.place(x=140, y=140) self.retry_button = tk.Button(root, text='リトライ') def reset(self): pass def display(self,enemy, result): self.enemy_label.configure(images=self.images) if result == DRAW: self.text_label.configure(text='あいこ') elif result == WIN: self.text_label.configure(text='勝ち!') else: self.text_label.configure(text='負け!') class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) master.geometry('420x420') master.title('ジャンケンゲーム') self.view = View() self.view.gu_button['command'] = lambda: self.judge(0) self.view.choki_button['command'] = lambda: self.judge(1) self.view.pa_button['command'] = lambda: self.judge(2) def judge(self, my_hand): enemy = random.randint(0, 2) result = rules[(my_hand, enemy)] self.view.display(enemy, result) def retry(self): self.view.reset() root = tk.Tk() app = Application(master=root) app.mainloop()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

コードの78行、83行、59行に何等かの問題があることは確認できたが、
何をどのように修正すれば直るのかわかりませんでした。

補足

バージョン Python 3.8.2

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

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

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

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

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

melian

2024/05/05 03:20

"images" 属性ではなく "image" かと思います。また、対戦相手の手はグー・チョキ・パーのいずれか一つなので、self.image[enemy] とします。 self.enemy_label.configure(images=self.images) => self.enemy_label.configure(image=self.images[enemy]) それから、rules の定義が誤っています。正しくは以下の様になるのでしょう。 rules = { (0, 0): DRAW, (0, 1): WIN, (0, 2): LOSE, (1, 0): LOSE, (1, 1): DRAW, (1, 2): WIN, (2, 0): WIN, (2, 1): LOSE, (2, 2): DRAW }
meg_

2024/05/05 03:21

> コードの78行、83行、59行に何等かの問題があることは確認できたが、 エラーメッセージよりエラー発生行は59行目かと思います。エラーメッセージの読み方を確認されると良いかと思います。 > unknown option "-images" > 何をどのように修正すれば直るのかわかりませんでした。 「images」という引数が間違っているとエラーメッセージは指摘しているようです。タイプミスが無いかオプション指定が間違っていないか公式ドキュメントを確認すると良いかと思います。
jimbe

2024/05/05 07:17

display の result は DRAW 等なのですから if で判断するまでもなく text=result で良いのではないでしょうか。
Risekorise

2024/05/05 07:33

コメントありがとうございます。指摘いただいた箇所を訂正したところ、 正しく作動しました。ご指導ありがとうございました。 ※rulesは前に使えたものをコピペしたのですが、確かに今のコード  ですと辻褄が合っていませんでした。
can110

2024/05/07 01:34

解決おめでとうございます! 解決方法をまとめて、「自己解決」として回答してください! 同じように困っている人の貴重な情報になると思います。
guest

回答1

0

コメントより先に回答を提示したのに、お役に立てなかったようなので削除します。

投稿2024/05/05 03:05

編集2024/05/05 10:15
hiroki-o

総合スコア1467

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問