8

これは、スタック オーバーフローに関する私の最初の投稿です。私は何年もの間、このサイトに情報を求めて潜んでいましたが、常に役立つので、最初の質問を投稿しようと思いました.

似たような例をいくつか探していますが、何も見つからないようです。

最終的に、テキスト抽出プログラムで偽陽性と偽陰性を見つけるための単純なテキスト UI を作成しようとしています。偽陽性モジュールは単純な yes/no 選択であり、色付きのテキストの表示と getch() の使用は簡単です。ただし、偽陰性の部分は難しくなっています。

だから、これは私がやりたいことです:

  1. 画面に文字列を表示します (今のところスクロールは忘れてください....うーん) 改行のない文字列のみになります。
  2. ユーザーはテキストを見て、'h' を押してハイライト モードに入ります。
  3. 次に、ユーザーはカーソルを制御してテキストの一部(表示されたまま)の上に移動し、「v」を選択して強調表示を開始できます(これをできるだけviに近づけようとしています)
  4. 次に、ユーザーはコントロール キー (矢印、hjkl) を使用してカーソルを開始点から終了点に移動し、途中でテキストを強調表示します。この強調表示された部分は、偽陰性である単語である必要があります
  5. ユーザーが何らかのキー (おそらく 'y') を押すと、選択したテキストが色付けされるか、強調表示されたままになり、強調表示されたテキストは後で処理する変数に保存されます。
  6. ユーザーはハイライト モードを終了し、次に進みます。

開始するアイデアはありますか?画面にテキストを表示したままカーソルを移動するなどの簡単なことを試していますが、役に立ちません。

curses.textpad.TextBox() モジュールは知っていますが、挿入や削除などの編集を実行しますが、これはやりたくないことです。おそらくそれを無効にする方法があります。

他にも質問がありますが、とりあえずこれだけにしておきます。

ありがとう!!

ニール

編集: より具体的に言うと、プログラム全体を作成するためのヘルプを探しているわけではありません。カーソルを表示されたテキストの上に移動し、強調表示し、選択して変数に保存するのを手伝ってください。

4

2 に答える 2

13

他の誰かがこれをウェブで検索していて、この質問に出くわした場合に備えて、この質問を更新したいと思います。

さて、答えは実際には非常に単純で、Pythonのcursesドキュメントにリストされているすべての関数を読む必要がありました。

私が行ったのは、3つのステートマシンを作成することでした:状態1:通常モード(テキストのみを表示)、状態2:カーソルがウィンドウ内を移動できるようにするハイライトモード、および状態3:左からの移動が制限される蛍光ペンモードテキストの真上に移動し、移動中にテキストを強調表示します。

このタスクを実行するには、いくつかの基本的なcurses関数呼び出しが必要です。

別々のウィンドウを作成しましたが、説明のために1つのウィンドウを想定します。

ウィンドウにテキストを表示し、次のことに固執します。

window.addstr()
window.refresh()

カーソルを移動するには:

#get current cursor position
curr_y, curr_x = window.getyx()

# depending on direction, update the cursor with
next_y, next_x = get_next_direction()

# place cursor in new position
window.move(next_y, next_x)

window.refresh()

カーソルが強調表示の開始点を超えたら、「v」を押して蛍光ペンの状態に入り、カーソルの移動を制限して、選択したテキストの属性を変更します。

# get current cursor position
curr_y, curr_x = window.getyx()

# save position for later use
start_y = curr_y; start_x = curr_x

# loop until 'v' is pressed again
while highlight_state:
    # change the attribute of the current character, for 1 character only, to reverse
    window.chgat(curr_y,curr_x, 1, curses.A_REVERSE)
    curr_y, curr_x = get_next_direction()

# save end state, this is buggy obviously, but you get the point
end_y = curr_y; end_x = curr_X

次に、その情報を最初から最後まで抽出します

# get integer representation of char at positiong

outstr = ''
#from start to end
char_as_int = windows.inch(y,x)
char = char_as_int & 0000FF
attr = char_as_int & FFFF00 #not useful here, but maybe later

outstr += char

それでおしまい!また、ハイライトされたマテリアルを保存する別の方法も試しました。これは、基本的にx、y座標で、表示されている文字列のインデックスに変換されましたが、文字列表現(改行、タブなど)で発行できるようになりました。やるのが難しい。

より効率的でクリーンな方法についてコメントがあれば、返信してください。

于 2011-07-27T17:32:11.187 に答える
0

ncurses については何も知りませんが、Tkinter または他の GUI ツールキットの 1 つを使用すると、キャンバスで実行できます。最初にスクロール領域を設定し、次に "h" キーをバインドしてハイライト変数を True に設定し、マウス クリックを開始位置を取得する関数にバインドし、左矢印と右矢印をバインドして左または右に移動します。文字、カーソルを移動し、次の文字の色を反転させるだけでなく、開始点からの文字数を追跡します。これにより、終了位置もわかり、「y」をバインドしてテキストをコピーします.

各部分はかなり単純な機能であるため、見た目ほど複雑ではありません。もちろん、これはすべてフォント サイズに依存します。テキストを固定フォントで表示して、各文字が同じ幅を占めるようにすることをお勧めします。繰り返しますが、ncurses についてはわかりませんが、どのツールキットにも似ています。ユーザーがマウス クリックで 1 行全体を選択できるように回避できれば、コーディングがはるかに簡単になります。実際に Tkinter または wxPython を使用することを決定し、追加のヘルプが必要な場合は、いくつかのコードを投稿してください。

于 2011-07-24T18:46:42.607 に答える