実現したいこと
ジャンケンゲームを正常に作動させる
※ジャンケンゲームの最初のボードは表示されますが、グー、チョキ、パーの
ボタンを押すと、「勝ち」、「負け」、「あいこ」の表示がされず、エラーと
なります。これを改善したいです。
発生している問題・分からないこと
ジャンケンゲームの最初のボードは表示されますが、グー、チョキ、パーの
ボタンを押すと、「勝ち」、「負け」、「あいこ」の表示がされず、エラーと
なります。これを改善したいです。
エラーメッセージ
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
"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
}
> コードの78行、83行、59行に何等かの問題があることは確認できたが、
エラーメッセージよりエラー発生行は59行目かと思います。エラーメッセージの読み方を確認されると良いかと思います。
> unknown option "-images"
> 何をどのように修正すれば直るのかわかりませんでした。
「images」という引数が間違っているとエラーメッセージは指摘しているようです。タイプミスが無いかオプション指定が間違っていないか公式ドキュメントを確認すると良いかと思います。
display の result は DRAW 等なのですから if で判断するまでもなく text=result で良いのではないでしょうか。
コメントありがとうございます。指摘いただいた箇所を訂正したところ、
正しく作動しました。ご指導ありがとうございました。
※rulesは前に使えたものをコピペしたのですが、確かに今のコード
ですと辻褄が合っていませんでした。
解決おめでとうございます!
解決方法をまとめて、「自己解決」として回答してください!
同じように困っている人の貴重な情報になると思います。
