Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Playing with curses 
Ransui Iso 
Strategic Technology Div, X-Listing Co, Ltd. 
2013-09-15 
PyCON APAC 2013 in Japan
お前誰よ? 
Ransui Iso 
Work at X-Listing Co, Ltd. 
http://www.xlisting.co.jp/ 
Pythonは1998年から使っています。 
E-Commerceエンジンやサーチエンジンの開...
お話する内容 
● Terminal 
● termcap / terminfo 
● curses 
– Screen / Window 
– Output / Input 
– Attribute 
● Demo 
– A Maze Sol...
History of Terminal
Console
TTY ASR-33
VT-100
Tektronix
X-Terminal
Terminal Emulator
Escape sequence
表示の制御 
● 特殊なバイトシーケンスを送り込む 
● 0x1B (ESCのコード)を先頭にして続くバイト列で色々な 
パラメータや制御を指定する 
Python 3.3.2 (default, Sep 15 2013, 10:43:16) ...
termcap / terminfo 
● 制御コマンドのカタログ 
● 端末ごとに各機能がどのようなシーケンスになるかが記述 
されている 
– termcapは1個のテキストファイル 
– terminfoは機種ごとに分かれていてコンパイル...
curses
端末に依存しない制御 
● キャラクタ端末の抽象化レイヤー 
● もっと抽象化されたインタフェースを提供してくれる 
– Window, Pad 
– 抽象化された色、キーコード等 
● 基本はCのライブラリ 
1 
– ほとんどはncurse...
制御のしくみ 
● 基本はwindowオブジェクト 
抽象化されたキーコード 
1 
Window 
Keyboard 
物理画面 
差分更新 
Application 
Code 
API
おやくそく 
● Hello World 
1 
# ­* 
­coding: 
utf­8 
­* 
­import 
curses 
import locale 
def main(stdscr): 
stdscr.clear() 
std...
cursesを使う時のテンプレ 
● locale.setlocale(locale.LC_ALL, "") 
● 非ASCIIなバイトシーケンスをどう扱うか 
● バックエンドのncursesはlocale情報を見ている 
● LC_ALLを...
OverwarpしたWindow 
● cursesのwindowの基本はタイル型 
● 重なって表示されていても上下の概念は無い 
● curses.panel.Panelを使うとOverwrapできる 
1
詳しくは 
● 標準ドキュメントでほぼOK 
● 実はチュートリアルがあります 
– http://docs.python.jp/3/howto/curses.html 
● ライブラリリファレンス 
– http://docs.python....
Thank you for Listening 
Happy Hacking!
Upcoming SlideShare
Loading in …5
×

Playing with curses

2,145 views

Published on

@PyCon APAC 2013

Published in: Technology
  • Be the first to comment

Playing with curses

  1. 1. Playing with curses Ransui Iso Strategic Technology Div, X-Listing Co, Ltd. 2013-09-15 PyCON APAC 2013 in Japan
  2. 2. お前誰よ? Ransui Iso Work at X-Listing Co, Ltd. http://www.xlisting.co.jp/ Pythonは1998年から使っています。 E-Commerceエンジンやサーチエンジンの開発、Zopeを用いたWebサイト開発、その他 色々を経て、今はネット広告配信システムについての研究開発をしています。 最近はCommon Lispでシステム開発をしていますが、Pythonもヘビーに使っています。 Contacts http://www.facebook.com/ransui @ransui
  3. 3. お話する内容 ● Terminal ● termcap / terminfo ● curses – Screen / Window – Output / Input – Attribute ● Demo – A Maze Solver – Animation with thread
  4. 4. History of Terminal
  5. 5. Console
  6. 6. TTY ASR-33
  7. 7. VT-100
  8. 8. Tektronix
  9. 9. X-Terminal
  10. 10. Terminal Emulator
  11. 11. Escape sequence
  12. 12. 表示の制御 ● 特殊なバイトシーケンスを送り込む ● 0x1B (ESCのコード)を先頭にして続くバイト列で色々な パラメータや制御を指定する Python 3.3.2 (default, Sep 15 2013, 10:43:16) [GCC 4.6.3] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print("x1b[31mHello color worldx1b[0m") Hello color world >>> ● 端末の機種ごとにコマンドが違う ● DEC VT-100が広く使われたのでデファクトに ● ANSIエスケープシーケンスはVT-100のサブセット
  13. 13. termcap / terminfo ● 制御コマンドのカタログ ● 端末ごとに各機能がどのようなシーケンスになるかが記述 されている – termcapは1個のテキストファイル – terminfoは機種ごとに分かれていてコンパイル済みのバイナリ ● これを使うためのCライブラリがある – ものすごく低レイヤなのでプログラミングは死ぬ xterm|vs100|xterm xterm terminal emulator, ind=^J, cols#80, lines#25, clear=E[HE[2J, cub1=^H, am, cup=E[%i%p1%d;%p2%dH, cuf1=E[C, cuu1=E[A, el=E[K, ed=E[J, cud=E[%p1%dB, cuu=E[%p1%dA, cub=E[%p1%dD, cuf=E[%p1%dC, km, smso=E[7m, rmso=E[m, smul@, rmul@, bold=E[1m, rev=E[7m, blink=@, sgr0=E[m, rs1=E>E[1;3;4;5;6lE[?7hE[mE[rE[2JE[H, rs2=@ kf1=EOP, kf2=EOQ, kf3=EOR, kf4=EOS, ht=^I, ri=EM, vt@, xon@, csr=E[%i%p1%d;%p2%dr, il=E[%p1%dL, dl=E[%p1%dM, il1=E[L, dl1=E[M, ich=E[%p1%d@, dch=E[%p1%dP, ich1=E[@, dch1=E[P, use=vt100­am,
  14. 14. curses
  15. 15. 端末に依存しない制御 ● キャラクタ端末の抽象化レイヤー ● もっと抽象化されたインタフェースを提供してくれる – Window, Pad – 抽象化された色、キーコード等 ● 基本はCのライブラリ 1 – ほとんどはncurses。たまに古いcurses – PythonのcursesモジュールはCライブラリのWrapper – 関数名とかセンスないけれど、作られた時代が時代なのでしかたが ない
  16. 16. 制御のしくみ ● 基本はwindowオブジェクト 抽象化されたキーコード 1 Window Keyboard 物理画面 差分更新 Application Code API
  17. 17. おやくそく ● Hello World 1 # ­* ­coding: utf­8 ­* ­import curses import locale def main(stdscr): stdscr.clear() stdscr.border() stdscr.addstr(1, 1, "波浪ワールド", curses.A_BOLD) stdscr.refresh() while True: if stdscr.getch() == 0x1b: break curses.flash() if __name__ == "__main__": locale.setlocale(locale.LC_ALL, "") curses.wrapper(main)
  18. 18. cursesを使う時のテンプレ ● locale.setlocale(locale.LC_ALL, "") ● 非ASCIIなバイトシーケンスをどう扱うか ● バックエンドのncursesはlocale情報を見ている ● LC_ALLを空文字列にセットするとシステムのデフォルト が使われる ● curses.wrapper() 1 ● 端末の初期化とか色々やってくれる ● エラー出たり例外出た時に、端末のモードを正しく復帰し てくれる ● 呼び出し先が受け取るstdscrは物理画面全体を覆う Windowオブジェクト
  19. 19. OverwarpしたWindow ● cursesのwindowの基本はタイル型 ● 重なって表示されていても上下の概念は無い ● curses.panel.Panelを使うとOverwrapできる 1
  20. 20. 詳しくは ● 標準ドキュメントでほぼOK ● 実はチュートリアルがあります – http://docs.python.jp/3/howto/curses.html ● ライブラリリファレンス – http://docs.python.jp/3.3/library/curses.html
  21. 21. Thank you for Listening Happy Hacking!

×