web-dev-qa-db-ja.com

マウスの位置Python Tkinter

マウスの位置を取得して変数として設定する方法はありますか?

16
Kyle Pfromer

<Motion>イベントに反応するコールバックを設定できます。

import Tkinter as tk
root = tk.Tk()

def motion(event):
    x, y = event.x, event.y
    print('{}, {}'.format(x, y))

root.bind('<Motion>', motion)
root.mainloop()

どのような変数が必要なのかわかりません。上記では、ローカル変数xおよびyをマウス座標に設定しています。

motionをクラスメソッドにすると、インスタンス属性self.xおよびself.yをマウス座標に設定でき、他のクラスメソッドからアクセスできるようになります。

22
unutbu

いつでもメソッドwinfo_pointerxおよびwinfo_pointeryを使用して、ルートウィンドウに相対的なX、Y座標を取得できます。それを絶対スクリーン座標に変換するには、winfo_pointerxまたはwinfo_pointeryを取得し、そこからそれぞれwinfo_rootxまたはwinfo_rootyを減算します

例えば:

root = tk.Tk()
...
x = root.winfo_pointerx()
y = root.winfo_pointery()
abs_coord_x = root.winfo_pointerx() - root.winfo_rootx()
abs_coord_y = root.winfo_pointery() - root.winfo_rooty()
24
Bryan Oakley

個人的には、Tkinterと組み合わせてもpyautoguiを使用することを好みます。 Tkinterアプリに限定されませんが、デュアルスクリーン構成でも、画面全体で動作します。

    import pyautogui
    x, y = pyautogui.position()

さまざまな位置を保存する場合は、オンクリックイベントを追加します。
元の質問はTkinterについてです。

1
JOM

ブライアンの答えを改善したいと思います。これは、モニターが1台の場合にのみ機能しますが、複数のモニターがある場合は、常にメインモニターに対する座標を使用します。両方のモニターに対して相対的な位置を見つけて正確な位置を取得するには、このようにvrootの代わりにrootを使用します

root = tk.Tk()
...
x = root.winfo_pointerx()
y = root.winfo_pointery()
abs_coord_x = root.winfo_pointerx() - root.winfo_vrootx()
abs_coord_y = root.winfo_pointery() - root.winfo_vrooty()
0
Tyler Silva