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

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

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

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

Q&A

解決済

1回答

572閲覧

.bindを二つ実行する際に、片方は繰り返し実行されるのにもう片方は1度しか実行されません

Jane-1003

総合スコア4

Python

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

0グッド

0クリップ

投稿2023/02/16 18:18

実現したいこと

キャラクター(ここでは赤い丸)を動かしたときに各操作ごとに"ok"と出力したいです

前提

迷路ゲームを作っています。以下のコードを実行し赤い丸を迷路上で動かしたとき、毎回の移動ごとに関数checkを実行して"ok"と出力したいのですが、最初の一度しか実行されません。どこに問題があって思った通りの実行結果が得られないのでしょうか。ご教示お願い致します。

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

エラーメッセージ

該当のソースコード

PYTHON

1ソースコード 2from dataclasses import dataclass, field 3from typing import * 4from tkinter import* 5 6# 定数の設定 7CANVAS_WIDTH = 320 # 画面横サイズ 8CANVAS_HEIGHT = 320 # 画面縦サイズ 9BLOCK_SIZE = 40 # 1ブロックのサイズ 10 11# マップ 12# 0 1 2 3 4 5 6 7 # 13MAP = [[1,0,0,0,0,0,0,0], 14 [1,0,0,1,1,1,1,0], 15 [1,1,1,1,0,0,1,0], 16 [0,0,0,0,1,1,1,0], 17 [0,0,0,0,1,0,0,0], 18 [0,0,0,0,1,1,1,0], 19 [0,0,0,0,0,0,1,1], 20 [0,0,0,0,0,0,0,2]] 21 22@dataclass 23class Maze: 24 map: List = field(default_factory=lambda: MAP) 25 size: int = BLOCK_SIZE 26 27 def createMaze(self): 28 x, y = 0, 0 29 for row in self.map: 30 for ele in row: 31 if ele == 0: # 壁を描画 32 canvas.create_rectangle( 33 x*self.size, y*self.size, x*self.size+self.size, y*self.size+self.size, 34 fill="#484848", outline="#484848" 35 ) 36 elif ele == 1: # 通路を描画 37 canvas.create_rectangle( 38 x*self.size, y*self.size, x*self.size+self.size, y*self.size+self.size, 39 fill="#E0E0E0", outline="#E0E0E0" 40 ) 41 elif ele == 2: # ゴールの描画 42 canvas.create_rectangle( 43 x*self.size, y*self.size, x*self.size+self.size, y*self.size+self.size, 44 fill="#48B060", outline="#48B060" 45 ) 46 x += 1 47 else: 48 x = 0 49 y += 1 50 51@dataclass 52class Character: 53 id: int = 0 54 x_pos: int = 0 55 y_pos: int = 0 56 size: int = BLOCK_SIZE #とりあえず赤い円を移動させる 57 58 def move(self, event): 59 # キー名取得 60 key_name = event.keysym 61 62 # 移動可否確認 63 if key_name == "Left": 64 if self.x_pos > 0 and MAP[self.y_pos][self.x_pos-1] != 0: 65 self.x_pos -= 1 66 elif key_name == "Right": 67 if self.x_pos < len(MAP[self.y_pos])-1 and MAP[self.y_pos][self.x_pos+1] != 0: 68 self.x_pos += 1 69 elif key_name == "Up": 70 if self.y_pos >0 and MAP[self.y_pos-1][self.x_pos] != 0: 71 self.y_pos -= 1 72 elif key_name == "Down": 73 if self.y_pos < len(MAP)-1 and MAP[self.y_pos+1][self.x_pos] != 0: 74 self.y_pos += 1 75 # 円表示 76 canvas.coords( 77 self.id, self.x_pos*self.size, self.y_pos*self.size, 78 self.x_pos*self.size+self.size, self.y_pos*self.size+self.size 79 ) 80 81@dataclass 82class Game: 83 84 def makeCharacter(self, x, y, size): 85 id = canvas.create_oval( 86 x, y, x+size, y+size,outline="red", fill="red" 87 ) 88 return Character(id, x, y, size) 89 90 def check(self): 91 print("ok") 92 93maze = Maze() 94game = Game() 95 96# キャンバスの設定 97tk = Tk() 98canvas = Canvas(tk, width=CANVAS_WIDTH, height=CANVAS_HEIGHT) 99canvas.pack() 100 101# 迷路とキャラクターの作成 102maze.createMaze() 103character = game.makeCharacter(0, 0, BLOCK_SIZE) 104 105canvas.bind("<KeyPress>", character.move) 106canvas.bind("<KeyPress>", game.check()) 107canvas.focus_set() 108 109tk.mainloop() 110 111### 試したこと 112 113ここに問題に対して試したことを記載してください。 114 115### 補足情報(FW/ツールのバージョンなど) 116 117ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、Game.check() メソッドのパラメータに event を追加します。(_ でも構いません)

python

1@dataclass 2class Game: 3 4 : 5 6 def check(self, event): 7 print("ok")

そして、bind() の部分を以下の様に変更します。add キーワードに + を指定することで、同一のウィジェットの同じイベントに複数のコールバック関数を設定できます。

python

1canvas.bind("<KeyPress>", character.move) 2canvas.bind("<KeyPress>", game.check, add='+')

投稿2023/02/16 18:40

melian

総合スコア19618

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

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

Jane-1003

2023/02/18 14:14

解答ありがとうございます。無事解決しました。 同じイベントに複数のコールバック関数を設定する場合は、関数の引数にeventを入れ、bindの引数にaddを追加するということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問