2011-07-24 31 views
8

To jest mój pierwszy wpis do przepełnienia stosu. Przeczekałem tę stronę od lat i zawsze jest to pomocne, więc pomyślałem, że opublikuję pierwsze pytanie.Zaznaczanie i wybieranie tekstu za pomocą przekleństw Python

Szukałem podobnych przykładów, ale nie mogę niczego znaleźć.

Ostatecznie próbuję napisać prosty tekst do wykrycia fałszywych trafień i fałszywych negatywów w programie do wyodrębniania tekstu. Moduł fałszywie dodatni jest prostym wyborem tak/nie, a wyświetlanie tekstu w kolorze i używanie getch() jest dość łatwe. Fałszywa część negatywna staje się jednak trudna.

Więc to, co chcę zrobić:

  1. wyświetlaczu napis na ekranie (na razie zapomnieć przewijanie .... ugh) To będzie tylko ciągiem bez nowej linii.
  2. Użytkownik widzi tekst i naciska przycisk "h", aby przejść do trybu podświetlania.
  3. Użytkownik może następnie sterować kursorem, aby przesunąć go po części tekstu (nadal wyświetlane), i wybrać "v", aby rozpocząć podświetlanie (staram się zrobić to tak blisko jak tylko mogę).
  4. użytkownik następnie używa klawiszy sterujących (strzałki, hjkl), aby przesunąć kursor od punktu początkowego do punktu końcowego, podświetlając tekst w drodze. Ta podświetlona część powinna być słowem, które jest fałszywie ujemnym. Użytkownik naciśnie klawisz (prawdopodobnie "y"), a zaznaczony tekst jest kolorowy lub pozostaje podświetlony, a wyróżniony tekst jest zapisywany do pewnej zmiennej, którą ja ' Zajmę się później.
  5. Użytkownik wychodzi z trybu podświetlania i kontynuuje.

Wszelkie pomysły na START? Próbuję prostych rzeczy, takich jak utrzymywanie tekstu na ekranie i przesuwanie kursora, ale bez skutku.

Jestem świadomy modułu curses.textpad.TextBox(), ale wykonuje on edycję, taką jak wstawianie i usuwanie, czego nie chcę robić. Być może istnieje sposób, aby to wyłączyć.

Mam inne pytania, ale zachowam to na razie.

Dzięki!

Neal

Edycja: Aby być bardziej konkretne, ja nie szukam pomocy w napisaniu cały program, po prostu pomóc, przesuwając kursor nad wyświetlanego tekstu, podświetlając je i wybierając je i zapisując go w zmiennej.

Odpowiedz

12

Chciałbym zaktualizować to pytanie na wypadek, gdyby ktoś szukał w Internecie tego i natknął się na to pytanie.

Okay, więc odpowiedź była całkiem prosta i wymagała przeczytania wszystkich funkcji wymienionych w dokumentacji przekleństw Pythona.

Co zrobiłem to maszyna 3 stan: Stan 1: Tryb normalny (wyświetla tylko tekst), Stan 2: tryb podświetlania, pozwól kursorowi poruszać się po oknie i Stan 3: tryb wyróżnienia, który daje tylko ograniczony ruch od lewej do prawej nad tekstem i podświetla tekst podczas jego przesuwania.

Aby wykonać to zadanie, wystarczy kilka podstawowych wywołań funkcji.

Stworzyłem osobne okna, ale założę tylko jedno okno do wyjaśnienia.

Czy tekst wyświetlany w oknie, trzymać się z:

window.addstr() 
window.refresh() 

Dla przesuwając kursor po:

#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() 

Gdy kursor znajduje się nad punktem wyjścia dla podkreślając, nacisnąć „v” wejdź w stan zakreślacza i ogranicz ruch kursora, zmień atrybut zaznaczonego tekstu:

# 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 

Teraz wyodrębnij tę informację od początku do końca

# 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 

To wszystko! Próbowałem też innego sposobu, aby zapisać podświetlony materiał, który zasadniczo przekształcił współrzędne x, y do indeksu łańcucha, który był wyświetlany, ale który pozwolił na wydawanie w postaci ciągów znaków (nowe linie, tabulatory itd.) Oraz tylko trudniejsze do zrobienia.

Jeśli ktoś ma uwagi na temat bardziej wydajnej/czystej metody, odpowiedz!

0

Nie wiem nic o ncurses, ale używając Tkintera lub jednego z innych zestawów narzędzi GUI, można to zrobić za pomocą płótna. Najpierw ustawiono obszar przewijania, a następnie powiązanie klawisza "h", aby ustawić zmienną podświetlenia na True, powiązanie kliknięcia myszą z funkcją, która pobiera lokalizację do rozpoczęcia, powiązanie lewej i prawej strzałki w celu przesunięcia w lewo lub prawą jedną literę, a następnie przesuń kursor i odwróć kolory następnej litery, a także śledź liczbę liter znajdujących się w punkcie początkowym, które również wskazują lokalizację końcową, i wiążą "y", aby skopiować tekst.

Nie jest to tak skomplikowane, jak mogłoby się wydawać, ponieważ każda część jest dość prostą funkcją. Wszystko to oczywiście zależy od rozmiaru czcionki, a proponuję wyświetlać tekst za pomocą czcionki stałej, aby każda litera zajmowała tę samą szerokość.Po raz kolejny nie znam ncurses, ale byłby podobny do jakiegokolwiek zestawu narzędzi. Jeśli możesz pracować w taki sposób, aby użytkownik mógł wybrać jedną całą linię jednym kliknięciem myszy, znacznie ułatwia to kodowanie. Po powrocie z pewnym kodem, jeśli rzeczywiście zdecydujesz się pójść z Tkinter lub wxPython i potrzebujesz dodatkowej pomocy.

+0

Dziękuję za odpowiedź. Wyobrażam sobie, że Tkinter może być łatwiejszy w użyciu. Problem polega na tym, że muszę zdalnie uruchamiać serwer, który muszę ssh dwa razy, aby wejść, a serwer końcowy nie jest połączony z Internetem (zawiera poufne informacje). Myślę, że ma bibliotekę Tkinter, więc muszę to sprawdzić. Ponieważ muszę uruchomić wszystko przez terminal, myślę, że mogę ssh -X; ssh -X, aby móc stworzyć środowisko okienkowania. – Neal

Powiązane problemy