6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】コンソールへのクリック位置を取得する

Posted at

はじめに

cursesライブラリを使って、コンソールへのマウスクリックの位置を取得する。コンソールアプリを作ろうと思い、そのための自分用メモ。

cursesライブラリ

cursesって何?という説明は以下。

curses ライブラリは、VT100s や Linux コンソール、さまざまなプログラムが提供するエミュレーション端末といったテキストベースの端末(ターミナル)のために、端末に依存しないスクリーン描画や、キーボードの処理を提供します。端末はカーソルの移動や、画面のスクロール、領域の消去といった共通の操作を行うための様々な制御コードをサポートします。端末の種類によって大きく異なる制御コードを使うことがあり、しばしば独特の癖があります。

また、より詳しい説明は以下。

Windowsの場合

cursesはWindowsには標準で入っていないので、Windows用のライブラリをインストールしておく。

> pip install windows-curses

マウスイベントの取得

マウスイベントを取得するサンプルコード。

  • コンソールへ「クリック」した位置に座標(x, y)を印字
  • 「ダブルクリック」で画面を消去
  • 「q」を押すと終了
mouse_xy.py
import curses


def mouse_xy(stdscr):
    curses.mousemask(curses.ALL_MOUSE_EVENTS)
    while True:
        event = stdscr.getch()
        if event == ord('q'):
            break
        if event == curses.KEY_MOUSE:
            _, x, y, _, bstate = curses.getmouse()
            if bstate == curses.BUTTON1_CLICKED:
                stdscr.addstr(y, x, f'({x}, {y})')
            elif bstate == curses.BUTTON1_DOUBLE_CLICKED:
                stdscr.erase()


if __name__ == '__main__':
    curses.wrapper(mouse_xy)

実行の様子は以下。
mouse_xy.gif

curses.mousemask(mousemask)

mousemaskで指定したマウスイベントを許可する。以下のフラグを指定可能(一例)。マウスイベントを取得する前に実行しておく。

フラグ名 イベント
curses.ALL_MOUSE_EVENTS すべてのマウスイベント
curses.BUTTON1_PRESSED 左ボタンを押した時
curses.BUTTON1_RELEASED 左ボタンを離した時
curses.BUTTON1_CLICKED 左ボタンをクリックした時
curses.BUTTON1_DOUBLE_CLICKED 左ボタンをダブルクリックした時
curses.BUTTON1_TRIPLE_CLICKED 左ボタンをトリプルクリックした時

BUTTONの番号を変えれば、真ん中ボタン(BUTTON2)、右ボタン(BUTTON3)など対応するボタンを変更できる。(ボタンは1~5まで使える)

イベントを許可する例として以下のようにすると、左ボタンのクリック時かダブルクリック時のみイベント通知が発生するようになる。

curses.mousemask(curses.BUTTON1_CLICKED | curses.BUTTON1_DOUBLE_CLICKED)

stdscr.getch()

キーが押されるのを待ち、入力されたキーを取得する。マウス入力の場合は、curses.KEY_MOUSEキーとして取得する。

curses.getmouse()

stdscr.getch()curses.KEY_MOUSEを返して、マウス入力の通知後にこのメソッドを呼ぶと、マウスイベントを取得できる。取得した結果は以下のタプル形式。

(id, x, y, z, bstate)
タプルの値 意味
id デバイスの種類
x x座標
y y座標
z 未使用
bstate イベントの種類

stdscr.addstr(y, x, str)

(y, x)の位置から、strの文字列をコンソールに印字(上書き)。

stdscr.erase()

ウィンドウをクリアする。

curses.wrapper(func)

funcにコンソール処理をまとめた関数を指定する。funcの第一引数にはウィンドウオブジェクト(stdscr)が渡されるので、必ず用意しておく。他に引数が必要な場合は、続けてwrapperに渡しておくと、そのままfuncの第二引数以降に渡される。

wrapperを介して実行することで、cursesの初期設定と例外発生時の端末状態の復元をwrapperにお任せできる。

おわりに

cursesライブラリを使って、簡単にマウスをクリックした位置が取れた。これで何かしらコンソールをクリックして遊べるものが作れそう。

他にも、文字や背景に色を付けたりカーソルを移動させたりと、できることは多そう。それでは!

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?