MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Pythonの基礎 - マウスのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Pythonの基礎 - マウス
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Pythonでは、マウスの操作を自動化、または、マウスイベントを監視することができる。<br> これにより、GUIアプリケーションの自動テスト、定型作業の自動化、マクロの作成等が可能になる。<br> <br> 主なライブラリとして、以下に示す3つがある。<br> * PyAutoGUI *: クロスプラットフォーム対応のGUIオートメーションライブラリ *: マウス・キーボード操作の自動化に最適 * pynput *: マウス・キーボードの制御と監視が可能なライブラリ *: イベントリスナー機能が充実している。 * mouse *: シンプルで軽量なマウス操作ライブラリ *: 単純なマウス操作やイベントフックに適している。 <br><br> == PyAutoGUIによるマウス操作 == PyAutoGUIは、マウスやキーボードを自動で制御するためのライブラリである。<br> Windows、MacOS、Linuxで動作するクロスプラットフォーム対応である。<br> <br> ==== インストール ==== PyAutoGUIは、pipを使用してインストールする。<br> pip install pyautogui <br> Linuxの場合、画像認識やスクリーンショット機能を使用するために追加のパッケージが必要である。<br> # RHEL sudo dnf install scrot python3-tkinter python3-devel # SUSE sudo zypper install scrot python3-tk python3-devel <br> ==== 画面サイズの取得 ==== <code>size</code> 関数を使用すると、画面の解像度を取得できる。<br> <br> <syntaxhighlight lang="python"> import pyautogui width, height = pyautogui.size() print(f"画面サイズ: {width} x {height}") </syntaxhighlight> <br> # 出力例 画面サイズ: 1920 x 1080 <br> ==== マウス位置の取得 ==== <code>position</code> 関数を使用すると、現在のマウスカーソルの位置を取得できる。<br> 座標系は画面左上を原点 (0, 0) とし、右方向にX座標、下方向にY座標が増加する。<br> <br> <syntaxhighlight lang="python"> import pyautogui x, y = pyautogui.position() print(f"マウス位置: ({x}, {y})") </syntaxhighlight> <br> # 出力例 マウス位置: (500, 300) <br> ==== マウスの移動 ==== <code>moveTo</code> 関数を使用すると、指定した座標にマウスカーソルを移動できる。<br> 第3引数に秒数を指定すると、その時間をかけてスムーズに移動する。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 座標 (100, 200) に瞬時に移動 pyautogui.moveTo(100, 200) # 座標 (500, 400) に2秒かけて移動 pyautogui.moveTo(500, 400, duration=2) </syntaxhighlight> <br> <code>move</code>関数 (<code>moveRel</code>関数) を使用すると、現在位置からの相対移動ができる。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 現在位置から右に100ピクセル、下に50ピクセル移動 pyautogui.move(100, 50) # 現在位置から左に200ピクセル移動 (1秒かけて) pyautogui.move(-200, 0, duration=1) </syntaxhighlight> <br> 移動時にイージング効果を適用することもできる。<br> <br> <syntaxhighlight lang="python"> import pyautogui # ゆっくり始まり速く終わる pyautogui.moveTo(100, 100, duration=2, tween=pyautogui.easeInQuad) # 速く始まりゆっくり終わる pyautogui.moveTo(500, 500, duration=2, tween=pyautogui.easeOutQuad) # バウンド効果 pyautogui.moveTo(300, 300, duration=2, tween=pyautogui.easeInBounce) </syntaxhighlight> <br> ==== クリック操作 ==== <code>click</code> 関数を使用すると、マウスのクリック操作ができる。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 現在位置で左クリック pyautogui.click() # 指定座標で左クリック pyautogui.click(100, 200) # 右クリック pyautogui.click(button='right') # 中央ボタンクリック pyautogui.click(button='middle') # ダブルクリック pyautogui.click(clicks=2) # トリプルクリック pyautogui.click(clicks=3) # 0.5秒間隔で3回クリック pyautogui.click(clicks=3, interval=0.5) </syntaxhighlight> <br> 専用の関数を使用することもできる。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 右クリック pyautogui.rightClick() # 中央ボタンクリック pyautogui.middleClick() # ダブルクリック pyautogui.doubleClick() # トリプルクリック pyautogui.tripleClick() </syntaxhighlight> <br> <code>mouseDown</code> 関数 と <code>mouseUp</code> 関数を使用すると、マウスボタンの押下と解放を個別に制御できる。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 左ボタンを押す pyautogui.mouseDown() # 左ボタンを離す pyautogui.mouseUp() # 右ボタンを押す pyautogui.mouseDown(button='right') # 指定座標で右ボタンを離す pyautogui.mouseUp(button='right', x=100, y=200) </syntaxhighlight> <br> ==== ドラッグ操作 ==== <code>drag</code> 関数を使用すると、ドラッグ操作ができる。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 現在位置から相対的にドラッグ pyautogui.drag(100, 50, duration=1) # 指定座標へドラッグ pyautogui.dragTo(500, 400, duration=1) # 右ボタンでドラッグ pyautogui.drag(100, 0, duration=1, button='right') </syntaxhighlight> <br> ==== スクロール操作 ==== <code>scroll</code> 関数を使用すると、マウスホイールのスクロール操作ができる。<br> 正の値で上方向、負の値で下方向にスクロールする。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 上方向に10クリック分スクロール pyautogui.scroll(10) # 下方向に10クリック分スクロール pyautogui.scroll(-10) # 指定座標でスクロール pyautogui.scroll(5, x=100, y=200) </syntaxhighlight> <br> MacOSとLinuxでは、水平スクロールも可能である。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 右方向にスクロール pyautogui.hscroll(10) # 左方向にスクロール pyautogui.hscroll(-10) </syntaxhighlight> <br> ==== フェイルセーフ機能 ==== PyAutoGUIには、安全のためにフェイルセーフ機能がデフォルトで有効になっている。<br> マウスカーソルを画面の四隅のいずれかに移動すると、<code>pyautogui.FailSafeException</code>例外が発生してプログラムが停止する。<br> <br> <syntaxhighlight lang="python"> import pyautogui # フェイルセーフを無効にする (非推奨) pyautogui.FAILSAFE = False # フェイルセーフを有効にする (デフォルト) pyautogui.FAILSAFE = True </syntaxhighlight> <br> また、各操作の間には0.1秒の遅延がデフォルトで設定されている。<br> <br> <syntaxhighlight lang="python"> import pyautogui # 操作間の遅延を変更 pyautogui.PAUSE = 0.5 # 0.5秒に設定 </syntaxhighlight> <br> <u>※注意</u><br> <u>フェイルセーフを無効にすると、プログラムの暴走時に停止できなくなる可能性がある。</u><br> <u>通常は有効のままにしておくことを推奨する。</u><br> <br><br> == pynputによるマウス操作 == pynputは、マウスやキーボードの制御と監視が可能なライブラリである。<br> 特にイベントリスナー機能が充実しており、マウスイベントの検知に適している。<br> <br> ==== インストール ==== pynputは、pipを使用してインストールする。<br> pip install pynput <br> ==== Controllerによるマウス制御 ==== <code>Controller</code>クラスを使用すると、マウスカーソルの移動やクリック操作ができる。<br> <br> <syntaxhighlight lang="python"> from pynput.mouse import Button, Controller mouse = Controller() # 現在位置の取得 print(f"マウス位置: {mouse.position}") # 指定座標に移動 mouse.position = (100, 200) # 相対移動 mouse.move(50, -30) </syntaxhighlight> <br> クリック操作も可能である。<br> <br> <syntaxhighlight lang="python"> from pynput.mouse import Button, Controller mouse = Controller() # 左クリック mouse.click(Button.left) # 右クリック mouse.click(Button.right) # ダブルクリック mouse.click(Button.left, 2) # ボタンを押す mouse.press(Button.left) # ボタンを離す mouse.release(Button.left) </syntaxhighlight> <br> スクロール操作も可能である。<br> <br> <syntaxhighlight lang="python"> from pynput.mouse import Controller mouse = Controller() # 上方向にスクロール mouse.scroll(0, 2) # 下方向にスクロール mouse.scroll(0, -2) # 右方向にスクロール (水平スクロール) mouse.scroll(2, 0) </syntaxhighlight> <br> ==== Listenerによるマウスイベント監視 ==== <code>Listener</code> クラスを使用すると、マウスイベントを監視できる。<br> <br> <syntaxhighlight lang="python"> from pynput import mouse def on_move(x, y): print(f"マウス移動: ({x}, {y})") def on_click(x, y, button, pressed): action = "押された" if pressed else "離された" print(f"{button} が ({x}, {y}) で{action}") if button == mouse.Button.right and pressed: # 右クリックでリスナーを停止 return False def on_scroll(x, y, dx, dy): direction = "上" if dy > 0 else "下" print(f"スクロール {direction}: ({x}, {y})") # リスナーを開始 with mouse.Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll ) as listener: listener.join() </syntaxhighlight> <br> # 実行例 : マウス移動: (512, 384) マウス移動: (520, 390) Button.left が (520, 390) で押された Button.left が (520, 390) で離された スクロール 上: (520, 390) Button.right が (525, 400) で押された <br> リスナーをスレッドとして起動することもできる。<br> <br> <syntaxhighlight lang="python"> from pynput import mouse import time def on_click(x, y, button, pressed): if pressed: print(f"{button} クリック: ({x}, {y})") # リスナーを非ブロッキングで開始 listener = mouse.Listener(on_click=on_click) listener.start() # 他の処理を実行 print("5秒間マウスイベントを監視します...") time.sleep(5) # リスナーを停止 listener.stop() print("監視終了") </syntaxhighlight> <br> ==== 同期的なイベント読み取り ==== <code>Events</code> クラスを使用すると、同期的にマウスイベントを読み取ることができる。<br> <br> <syntaxhighlight lang="python"> from pynput import mouse # イベントを1つずつ読み取る with mouse.Events() as events: for event in events: print(event) if isinstance(event, mouse.Events.Click): if event.button == mouse.Button.right: break </syntaxhighlight> <br><br> == mouseライブラリによるマウス操作 == mouseライブラリは、シンプルで軽量なマウス操作ライブラリである。<br> グローバルなマウスイベントのフックやシミュレーションが可能である。<br> <br> ==== インストール ==== mouseライブラリは、pipを使用してインストールする。<br> pip install mouse <br> ==== マウス位置の取得 ==== <code>get_position</code> 関数を使用すると、現在のマウス位置を取得できる。<br> <br> <syntaxhighlight lang="python"> import mouse x, y = mouse.get_position() print(f"マウス位置: ({x}, {y})") </syntaxhighlight> <br> ==== マウスの移動 ==== <code>move</code> 関数を使用すると、マウスカーソルを移動できる。<br> <br> <syntaxhighlight lang="python"> import mouse # 指定座標に移動 mouse.move(100, 200) # 相対移動 mouse.move(50, 30, absolute=False) # 時間をかけて移動 mouse.move(500, 400, duration=1) </syntaxhighlight> <br> ==== クリック操作 ==== <code>click</code> 関数を使用すると、クリック操作ができる。<br> <br> <syntaxhighlight lang="python"> import mouse # 左クリック mouse.click() # 右クリック mouse.click(button='right') # 中央ボタンクリック mouse.click(button='middle') # ダブルクリック mouse.double_click() </syntaxhighlight> <br> ==== ドラッグ操作 ==== <code>drag</code> 関数を使用すると、ドラッグ操作ができる。<br> <br> <syntaxhighlight lang="python"> import mouse # 始点から終点へドラッグ mouse.drag(100, 100, 300, 300, duration=1) </syntaxhighlight> <br> ==== スクロール操作 ==== <code>wheel</code> 関数を使用すると、スクロール操作ができる。<br> <br> <syntaxhighlight lang="python"> import mouse # 上方向にスクロール mouse.wheel(1) # 下方向にスクロール mouse.wheel(-1) </syntaxhighlight> <br> ==== イベントフック ==== <code>hook</code> 関数 や <code>on_click</code> 関数を使用すると、マウスイベントを監視できる。<br> <br> <syntaxhighlight lang="python"> import mouse # 左クリック時のコールバック mouse.on_click(lambda: print("左クリックされました")) # 右クリック時のコールバック mouse.on_right_click(lambda: print("右クリックされました")) # 中央ボタンクリック時のコールバック mouse.on_middle_click(lambda: print("中央ボタンがクリックされました")) # プログラムを待機 mouse.wait() </syntaxhighlight> <br> 全てのマウスイベントを監視する場合は、<code>hook</code>関数を使用する。<br> <br> <syntaxhighlight lang="python"> import mouse def callback(event): print(event) # 全てのマウスイベントをフック mouse.hook(callback) # 右クリックまで待機 mouse.wait(button='right') # フックを解除 mouse.unhook_all() </syntaxhighlight> <br> ==== ボタンの状態確認 ==== <code>is_pressed</code> 関数を使用すると、ボタンが押されているかどうかを確認できる。<br> <br> <syntaxhighlight lang="python"> import mouse if mouse.is_pressed(button='left'): print("左ボタンが押されています") if mouse.is_pressed(button='right'): print("右ボタンが押されています") </syntaxhighlight> <br><br> == ライブラリの比較と使い分け == 各ライブラリには特徴があり、用途に応じて使い分けることが重要である。<br> <br> <center> {| class="wikitable" |+ マウス操作ライブラリの比較 ! 機能 !! PyAutoGUI !! pynput !! mouse |- | style="text-align:center" | マウス移動 || style="text-align:center" | ○ || style="text-align:center" | ○ || style="text-align:center" | ○ |- | style="text-align:center" | クリック操作 || style="text-align:center" | ○ || style="text-align:center" | ○ || style="text-align:center" | ○ |- | style="text-align:center" | ドラッグ操作 || style="text-align:center" | ○ || style="text-align:center" | △ || style="text-align:center" | ○ |- | style="text-align:center" | スクロール操作 || style="text-align:center" | ○ || style="text-align:center" | ○ || style="text-align:center" | ○ |- | style="text-align:center" | イベント監視 || style="text-align:center" | × || style="text-align:center" | ○ || style="text-align:center" | ○ |- | style="text-align:center" | 画像認識 || style="text-align:center" | ○ || style="text-align:center" | × || style="text-align:center" | × |- | style="text-align:center" | キーボード操作 || style="text-align:center" | ○ || style="text-align:center" | ○ || style="text-align:center" | × (別ライブラリ) |- | style="text-align:center" | クロスプラットフォーム || style="text-align:center" | ○ || style="text-align:center" | ○ || style="text-align:center" | ○ |} </center> <br> 用途別の推奨ライブラリを以下に示す。<br> * GUIオートメーション (自動化スクリプト) *: PyAutoGUI *: 画像認識機能があり、マウスとキーボードの両方を扱える。 * イベント監視・マクロ作成 *: pynput *: リスナー機能が充実しており、低レベルなイベント制御が可能 * シンプルなマウス操作 *: mouse *: 軽量で使いやすく、単純なマウス操作やフックに適している。 <br><br> == 実践例 == ==== 画面上の特定位置を自動クリック ==== 以下の例では、5秒後に現在のマウス位置をクリックする。<br> <br> <syntaxhighlight lang="python"> import pyautogui import time print("5秒後に現在のマウス位置をクリックします...") print("クリックしたい位置にマウスを移動してください") time.sleep(5) x, y = pyautogui.position() print(f"位置 ({x}, {y}) をクリックします") pyautogui.click() </syntaxhighlight> <br> ==== マウス位置の連続記録 ==== 以下の例では、マウスの位置を1秒間隔で記録する。<br> <br> <syntaxhighlight lang="python"> import pyautogui import time positions = [] print("10秒間マウス位置を記録します...") for i in range(10): x, y = pyautogui.position() positions.append((x, y)) print(f"{i + 1}秒目: ({x}, {y})") time.sleep(1) print(f"記録された位置: {positions}") </syntaxhighlight> <br> ==== クリック位置の取得 ==== 以下の例では、ユーザがクリックした位置を取得する。<br> <br> <syntaxhighlight lang="python"> from pynput import mouse positions = [] def on_click(x, y, button, pressed): if pressed and button == mouse.Button.left: positions.append((x, y)) print(f"クリック位置 {len(positions)}: ({x}, {y})") if len(positions) >= 5: return False print("5箇所をクリックしてください...") with mouse.Listener(on_click=on_click) as listener: listener.join() print(f"記録された位置: {positions}") </syntaxhighlight> <br> ==== 自動スクロール ==== 以下の例では、Webページを自動的に下方向にスクロールする。<br> <br> <syntaxhighlight lang="python"> import pyautogui import time print("3秒後に自動スクロールを開始します...") time.sleep(3) for i in range(10): pyautogui.scroll(-3) # 下方向にスクロール print(f"スクロール {i + 1}/10") time.sleep(0.5) print("スクロール完了") </syntaxhighlight> <br><br> == トラブルシューティング == ==== Linuxでの権限エラー ==== Linuxでマウス操作ライブラリを使用する際に権限エラーが発生する場合がある。<br> <br> pynputの場合、X11セッションで実行する必要がある。<br> <br> # 環境変数の設定 export DISPLAY=:0 <br> mouseライブラリの場合、root権限が必要な場合がある。<br> sudo python3 script.py <br> ==== Windows DPIスケーリングの問題 ==== Windowsで高DPI設定を使用している場合、座標がずれることがある。<br> アプリケーションにDPI対応を宣言することで解決できる場合がある。<br> <br> <syntaxhighlight lang="python"> import ctypes # DPI対応を宣言 try: ctypes.windll.shcore.SetProcessDpiAwareness(2) except: pass </syntaxhighlight> <br> ==== MacOSでのアクセシビリティ権限 ==== MacOSでは、システム環境設定からアクセシビリティ権限を付与する必要がある。<br> <br> [システム環境設定] - [セキュリティとプライバシー] - [プライバシー] - [アクセシビリティ] で、実行するアプリケーション (ターミナルやPython) にチェックを入力する。<br> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Python,マウス操作,PyAutoGUI,pynput,mouse,自動化,GUI,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:Python]]
Pythonの基礎 - マウス
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse