はじめに
cursesライブラリを使って、コンソールへのマウスクリックの位置を取得する。コンソールアプリを作ろうと思い、そのための自分用メモ。
cursesライブラリ
cursesって何?という説明は以下。
curses ライブラリは、VT100s や Linux コンソール、さまざまなプログラムが提供するエミュレーション端末といったテキストベースの端末(ターミナル)のために、端末に依存しないスクリーン描画や、キーボードの処理を提供します。端末はカーソルの移動や、画面のスクロール、領域の消去といった共通の操作を行うための様々な制御コードをサポートします。端末の種類によって大きく異なる制御コードを使うことがあり、しばしば独特の癖があります。
また、より詳しい説明は以下。
Windowsの場合
cursesはWindowsには標準で入っていないので、Windows用のライブラリをインストールしておく。
> pip install windows-curses
マウスイベントの取得
マウスイベントを取得するサンプルコード。
- コンソールへ「クリック」した位置に座標(x, y)を印字
- 「ダブルクリック」で画面を消去
- 「q」を押すと終了
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)
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ライブラリを使って、簡単にマウスをクリックした位置が取れた。これで何かしらコンソールをクリックして遊べるものが作れそう。
他にも、文字や背景に色を付けたりカーソルを移動させたりと、できることは多そう。それでは!