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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

11979閲覧

pythonのbind()について

kakini

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/10 08:12

下記のコードで分からない所があります

python

1from tkinter import * 2import tkinter.messagebox as msgbox 3 4def main(): 5 global cv 6 win=Tk() 7 cv=Canvas(win,width=400,height=300) 8 cv.pack() 9 cv.bind("<1>",canvas_click) 10 win.mainloop() 11 12def canvas_click(e): 13 global cv 14 mx=e.x 15 my=e.y 16 cv.create_oval( 17 mx-10,my-10,mx+10,my+10, 18 fill="red") 19main()

関数canvas_clickについてなんですが
関数を定義した時引数にeと記述していますが、main()関数内でcv.bind("<1>",canvas_click)
でcanvas_clickを記述した時、canvas_clickに何か引数を渡しているわけでもないのに
何故、mx=**e.xとmy=e.y**といった記述でマウスのx座標、y座標が代入出来るんでしょうか?
そもそもe.xとe.yという記述はeという変数が持ってるデータアトリビュートという様な書き方と似てますけど
上記の式ではeは何も持ってない筈なんじゃないでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

canvas_clickに何か引数を渡しているわけでもないのに

公式ドキュメントによると、bind関数は以下のように定義されています。

def bind(self, sequence, func, add='')

funcは一引数を取り、イベントが起きるときに呼び出される Python 関数です。イベント・インスタンスが引数として渡されます。 (このように実施される関数は、一般に callbacks として知られています。)

すなわち、bind関数内のfunc関数に引数が記載されていなくとも、1つの引数が自動的に渡されます。
これは、こういう仕様です、としか言えないです。


そもそも、(中略)、上記の式ではeは何も持ってない筈なんじゃないでしょうか?

参考記事によると、引数となるeventオブジェクト(質問コードにおけるe)には、自動的に以下の情報が含まれています。

event.widget イベントを受け取った widget のインスタンス。

event.x 現在のマウスポインターの x 位置。(ピクセル)
event.y 現在のマウスポインターの y 位置。(ピクセル)
event.x_root 現在のマウスポインターの 画面上の x 位置。(ピクセル)
event.y_root 現在のマウスポインターの 画面上の y 位置。(ピクセル)
event.char キーボードイベント時のみ、キャラクタを文字で返す。
event.keysym キーボードイベント時のみ、そのキーのシンボル。
event.keycode キーボードイベント時のみ、このキーのキーコード。
event.num マウスボタンイベント時のみ、押されたマウスボタンのボタン番号。
event.width Configureイベント時のみ、widget の幅。(ピクセル)
event.height Configureイベント時のみ、widget の高さ。(ピクセル)
event.type イベントのタイプ。

参考記事:[Python]Tkinter イベントのバインディング の続き - Tkinter Event and binding

この内、event.x、event.yが処理に使われているので問題ないかと思います。

インスタンスなど難解な用語があり理解が難しいかもしれませんが、ご参考になれば幸いです。

投稿2019/04/10 13:39

amahara_waya

総合スコア1029

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

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

kakini

2019/04/11 04:31

回答ありがとうございます。 一応公式とかネットでも探してみたんですが知らない用語がたくさん出てきていまいち分からなくて >>bind関数内のfunc関数に引数が記載されていなくとも、1つの引数が自動的に渡されます。 これは、こういう仕様です、としか言えないです こういう回答ですと初心者の自分にもすんなりと受け入れやすいのでとてもありがたいです ありがとうございました
guest

0

canvas_clickに何か引数を渡しているわけでもないのに

何故、mx=e.xとmy=e.yといった記述でマウスのx座標、y座標が代入出来るんでしょうか?

上記の式ではeは何も持ってない筈なんじゃないでしょうか?

Pythonが渡してきます(リファレンス)。

なお、cv.bind("<1>",canvas_click)では、関数自体を引数としています。この行を実行した段階では、canvas_clickは実行されません。

投稿2019/04/10 08:16

maisumakun

総合スコア145183

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

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

kakini

2019/04/10 08:46

すみません、いまいちよく分からないのでもう少し具体的に説明が可能でしたらお願いいたします
maisumakun

2019/04/10 08:55

実際にマウスイベントが起きた時に、Tkinterのコードがcanvas_click(e)を、eにイベント情報を詰めて実行します。
kakini

2019/04/10 09:11

回答ありがとうございます。 >>Tkinterのコードがcanvas_click(e)を、eにイベント情報を詰めて実行します これは bind()関数?がcanvas_click(e)を、eにイベント情報を詰めて実行します と解釈も出来るんでしょうか?
maisumakun

2019/04/10 09:31

いえ、違います。bindはあくまで登録するだけです(イベントが起きればそのたびにcanvas_clickが実行されますし、逆に一度もイベントが起きなければcanvas_clickが実行されない可能性もあります)
kakini

2019/04/10 10:02

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問