0

私が書き込もうとしているプログラムは、「Hello World」をウィンドウに出力します。

Hello World をマウスでクリックすると、Hello World が 1 文字ずつ読み込まれます

次に、カーソルが画面のさらに下に移動し、読み取った内容が表示されます。

実際に表示されるのは文字化けです。

Hello world





          ^[[M %!^[[M#%!

そのはず:

Hello world





      Hello world

コードを以下に示します。

文字列全体を読み取る方法が見つからなかったため、文字列を1文字ずつ読み取っています。

import curses

# Initialize variables
q = -1
stdscr = curses.initscr()
curses.mousemask(1)
curses.start_color()

# color pair 1 = red text on white background
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
stdscr.bkgd(' ', curses.color_pair(1))
stdscr.addstr( "Hello world", curses.color_pair(1) )

# Move cursor furthur down screen and slightly to the right
stdscr.move(10,10)

while True:
  event = stdscr.getch()
  if event == ord('q'):
    break                    # quit if q is pressed

  if event == curses.KEY_MOUSE:
    _, mx, my, _, _ = curses.getmouse()
    y, x = stdscr.getyx()    # put cursor position in x and y


    # read the line character by character into char array called mystr
    mystr = []
    for i in range(140):
      mystr.append(stdscr.inch(my, i))  # read char into mystr
    stdscr.addstr(y, x, "".join(mystr))   # Try to display char array
                                        # but it's garbled
  stdscr.refresh()
curses.endwin()
4

1 に答える 1

1

あなたの例では、2 つの問題があります。

  • キーパッド関数を呼び出していません。オンにしない限り、イベントはファンクションキーではなくシングルバイトです
  • インチ関数は画面からデータを取得する唯一の方法ではなく、そのようなループで呼び出すと例外が発生します。

これは作り直された例です (画面を再描画するための ^L などのいくつかの機能を追加し、ヘッダー行で読み取られたテキストを表示します):

import curses

def hello_world():
  stdscr.erase()
  stdscr.addstr(curses.LINES / 2,
                curses.COLS / 2 - 5,
                "Hello world",
                curses.color_pair(1) )
  
def show_event(event):
  y, x = stdscr.getyx()    # save cursor position
  stdscr.addstr(1,0, "event:" + str(event) + ", KEY=" + curses.keyname(event))
  stdscr.clrtoeol()
  stdscr.move(y, x)

# Initialize variables
q = -1
stdscr = curses.initscr()
stdscr.keypad(1)
curses.mousemask(1)
curses.start_color()

# color pair 1 = red text on white background
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
stdscr.bkgd(' ', curses.color_pair(1))
hello_world()

# Move cursor furthur down screen and slightly to the right
stdscr.move(10,10)

while True:
  event = stdscr.getch()

  if event == 12:
    y, x = stdscr.getyx()    # put cursor position in x and y
    hello_world()
    stdscr.move(y, x)

  if event == ord('q'):
    break                    # quit if q is pressed

  if event == curses.KEY_MOUSE:
    _, mx, my, _, _ = curses.getmouse()

    mystr = stdscr.instr(my, mx) # read remainder of line
    stdscr.addstr(my, mx, "*") # mark where the mouse event occurred
    stdscr.addstr(0, 0, str(my) + "," + str(mx) + " {" + mystr.rstrip() + "}")
    stdscr.clrtoeol()
    stdscr.move(my, mx)

  show_event(event)
  stdscr.refresh()
curses.endwin()

于 2015-03-08T22:56:51.447 に答える