2011-07-24 97 views
8

這是我第一次發佈堆棧溢出。我一直在潛藏這個網站的信息多年,這總是有幫助的,所以我想我會發布我的第一個問題。用Python詛咒突出顯示和選擇文本

我一直在尋找一些類似的例子,但似乎無法找到任何東西。

最終,我試圖寫在文本提取程序發現假陽性和假陰性一個簡單的文本用戶界面。假陽性模塊是一個簡單的是/否選擇,顯示彩色文本和使用getch()很容易。然而,假陰性部分變得越來越困難。

原來這就是我想做的事:

  1. 顯示字符串到屏幕(忘了滾動現在....啊)它只會是一個沒有換行符的字符串。
  2. 用戶看到文本,並按'h'進入高亮模式。
  3. 然後用戶可以控制光標在文本的一部分上移動(仍然顯示),然後選擇'v'開始高亮顯示(我試圖使其儘可能接近vi)
  4. 然後用戶使用控制鍵(箭頭,hkkl)將光標從起點移動到終點,突出顯示路上的文字。這個突出部分應該是一個字是一個假陰性
  5. 用戶按下某些鍵(「y」的可能),並且所選擇的文本是有色的,或保持突出顯示,並突出顯示的文本是保存到一些變量I」稍後再處理。
  6. 用戶退出高亮模式並繼續。

任何想法甚至開始?我正在嘗試簡單的事情,如保持屏幕上的文本和移動光標,但無濟於事。

我知道了curses.textpad.TextBox()模塊,但它執行編輯喜歡的插入和刪除,這是我不想做的事。也許有一種方法可以禁用它。

我還有其他問題,但我現在要保持這個特定。

謝謝!

尼爾

編輯:更具體,我不尋求幫助編寫整個程序,只是幫助將光標移動到顯示的文本,突出它,選擇它,並在一個變量保存。

回答

12

我想更新這個問題,以防其他人在網上搜索這個問題並絆倒這個問題。

好的,所以答案其實很簡單,並且需要閱讀python curses文檔中列出的所有函數。

我做的是做一個3狀態機:狀態1:普通模式(僅顯示文本),狀態2:高亮模式,允許光標在窗口周圍移動,狀態3:高亮模式,只給出從左到右限制文字移動,並突出文字移動。

爲了完成這個任務,它只需要一些基本的curses函數調用。

我做了單獨的窗口,但我只是假設一個窗口來解釋。

不要在窗口中顯示的文字,堅持使用:

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座標轉換爲正在顯示的字符串的索引,但允許以字符串表示形式(換行符,製表符等)進行發佈,加上很難做到。

如果有人對更高效/更清潔的方法有任何意見,請回復!

0

我對ncurses一無所知,但使用Tkinter或其他GUI工具包之一,它可以用畫布完成。首先設置滾動區域,然後 綁定「h」鍵,以便將高亮變量設置爲True, 將鼠標單擊綁定到檢索要開始位置的函數, 綁定左右箭頭以向左移動或右移一個字母,然後移動光標並顛倒下一個字母的顏色,並跟蹤您從起始點開始的多少個字母,這也會告訴您結束位置,並綁定「y」以複製文本。

它並不複雜,因爲它似乎在每個部分是一個相當簡單的功能。所有這些當然都取決於字體大小,我建議用固定的字體顯示文本,這樣每個字母都佔據相同的寬度。再次,我不知道ncurses,但它會與任何工具包類似。如果您可以解決這個問題,那麼用戶可以通過點擊鼠標來選擇一條完整的線路,這使得編碼變得更容易。如果您確實決定使用Tkinter或wxPython並希望得到一些額外的幫助,請回復一些代碼。

+0

謝謝你的迴應。我想Tkinter可能更容易使用。問題是我必須遠程運行服務器,我必須ssh兩次才能進入,並且最終服務器未連接到Internet(它包含敏感信息)。我認爲它有一個Tkinter庫,所以我必須檢查它。因爲我必須通過終端運行所有的東西,我想我可以用ssh -X; ssh -X能夠創建一個窗口環境。 – Neal