Я хотел бы обновить этот вопрос на тот случай, если кто-то еще ищет в Интернете это и наткнется на этот вопрос.
Хорошо, поэтому ответ был довольно простым и требовал чтения всех функций, перечисленных в документации по python curses.
Что я сделал, так это сделал конечный автомат 3: State 1: обычный режим (отображает только текст), State 2: режим выделения, позволяет перемещать курсор по окну и State 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 в индекс отображаемой строки, но который позволял выпускать в представлении строки (переводы строки, табуляции и т. Д.), Плюс был просто сложнее сделать.
Если у кого-то есть комментарии относительно более эффективного / чистого метода, пожалуйста, ответьте!