2011-07-24 37 views
8

Đây là bài đăng đầu tiên của tôi để ngăn xếp tràn. Tôi đã lurking trang web này cho thông tin trong nhiều năm, và nó luôn luôn hữu ích, vì vậy tôi nghĩ rằng tôi sẽ gửi câu hỏi đầu tiên của tôi.Đánh dấu và chọn văn bản bằng lời nguyền Python

Tôi đã tìm kiếm một số ví dụ tương tự, nhưng dường như không tìm thấy bất kỳ điều gì.

Cuối cùng, tôi đang cố gắng viết một ui văn bản đơn giản để tìm kiếm các kết quả dương tính giả và âm bản sai trong một chương trình trích xuất văn bản. Mô-đun dương tính giả là một lựa chọn có/không đơn giản, và hiển thị văn bản màu và sử dụng getch() là đủ dễ dàng. Tuy nhiên, phần âm tính sai là trở nên khó khăn.

Vì vậy, đây là những gì tôi muốn làm:

  1. hiển thị một chuỗi lên màn hình (quên di chuyển cho bây giờ .... ugh) Nó sẽ chỉ là một chuỗi không có ký tự dòng mới.
  2. Người dùng nhìn thấy văn bản và nhấn 'h' để vào chế độ đánh dấu.
  3. Sau đó, người dùng có thể điều khiển con trỏ để di chuyển nó qua một phần văn bản (vẫn hiển thị) và chọn 'v' để bắt đầu làm nổi bật (Tôi cố gắng làm điều này gần vi nhất có thể)
  4. người dùng sau đó sử dụng các phím điều khiển (mũi tên, hjkl) để di chuyển con trỏ từ điểm bắt đầu đến điểm kết thúc, làm nổi bật văn bản trên đường đi. Phần được đánh dấu này phải là một từ sai âm
  5. Người dùng nhấn một số phím ('y' có thể) và văn bản đã chọn được tô màu hoặc vẫn được tô sáng và văn bản được đánh dấu sẽ được lưu vào một số biến mà tôi ' sẽ xử lý sau.
  6. Người dùng thoát chế độ làm nổi bật và tiến hành.

Bất kỳ ý tưởng nào thậm chí BẮT ĐẦU? Tôi đang thử những thứ đơn giản như giữ văn bản trên màn hình và di chuyển con trỏ xung quanh, nhưng không có kết quả.

Tôi biết về mô-đun curses.textpad.TextBox(), nhưng nó thực hiện chỉnh sửa như chèn và xóa, mà tôi không muốn làm. Có lẽ có một cách để vô hiệu hóa nó.

Tôi có các câu hỏi khác, nhưng tôi sẽ duy trì điều này cụ thể ngay bây giờ.

Cảm ơn !!

Neal

Edit: Để cụ thể hơn, tôi không tìm kiếm sự giúp đỡ bằng văn bản cho toàn bộ chương trình, chỉ cần giúp di chuyển con trỏ trên văn bản hiển thị, làm nổi bật nó, và chọn nó và lưu nó trong một biến.

Trả lời

12

Tôi muốn cập nhật câu hỏi này trong trường hợp bất kỳ ai khác đang tìm kiếm trên web về điều này và tình cờ gặp phải câu hỏi này.

Được rồi, vì vậy câu trả lời thực sự khá đơn giản và cần đọc tất cả các hàm được liệt kê trên tài liệu ngụy trang python.

Những gì tôi đã làm là tạo một máy trạng thái 3: Trạng thái 1: Chế độ thông thường (chỉ hiển thị văn bản), Trạng thái 2: chế độ đánh dấu, cho phép con trỏ di chuyển quanh cửa sổ và trạng thái 3: chế độ highlighter. chuyển động giới hạn từ trái sang phải trên các văn bản và làm nổi bật văn bản khi di chuyển.

Để thực hiện tác vụ này, chỉ cần thực hiện một số cuộc gọi hàm curses cơ bản.

Tôi đã tạo các cửa sổ riêng biệt, nhưng tôi sẽ chỉ giả định một cửa sổ duy nhất để giải thích.

Do văn bản hiển thị trong cửa sổ, gắn bó với:

window.addstr() 
window.refresh() 

Đối với di chuyển con trỏ xung quanh:

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

Khi con trỏ qua điểm khởi đầu để làm nổi bật, nhấn 'v' vào trạng thái highlighter và giới hạn chuyển động của con trỏ, thay đổi thuộc tính của văn bản đã chọn:

# 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 

Bây giờ, hãy trích xuất thông tin đó từ đầu đến cuối

# 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 

Vậy đó! Tôi cũng đã thử một cách khác để lưu tài liệu được tô sáng về cơ bản biến đổi x, y phối hợp với chỉ mục của chuỗi đang được hiển thị, nhưng điều đó cho phép phát hành trong biểu diễn chuỗi (dòng mới, tab, v.v.), khó làm hơn.

Nếu bất kỳ ai có nhận xét về phương pháp hiệu quả hơn/sạch hơn, vui lòng trả lời!

0

Tôi không biết gì về ncurses, nhưng sử dụng Tkinter hoặc một trong các bộ công cụ GUI khác, nó có thể được thực hiện bằng canvas. Trước tiên, bạn sẽ đặt vùng cuộn, sau đó liên kết khóa "h" để đặt biến đánh dấu thành True, liên kết nhấp chuột vào một hàm truy xuất vị trí bắt đầu, liên kết các mũi tên trái và phải để di chuyển sang trái hoặc phải một chữ cái và di chuyển con trỏ và đảo ngược màu của chữ cái tiếp theo cũng như theo dõi số thư bạn đến từ điểm bắt đầu, cũng cho bạn biết vị trí cuối cùng và liên kết "y" để sao chép bản văn.

Nó không phải là phức tạp vì nó có vẻ như mỗi phần là một chức năng khá đơn giản. Tất cả điều này tất nhiên sẽ phụ thuộc vào kích thước phông chữ, và tôi sẽ đề nghị hiển thị văn bản với một phông chữ cố định để mỗi chữ cái chiếm cùng chiều rộng.Một lần nữa, tôi không biết ncurses, nhưng nó sẽ tương tự với bất kỳ bộ công cụ nào. Nếu bạn có thể làm việc xung quanh để người dùng có thể chọn toàn bộ một dòng với một cú click chuột, nó làm cho việc viết mã dễ dàng hơn nhiều. Đăng lại với một số mã nếu bạn thực sự quyết định đi với Tkinter hoặc wxPython và muốn một số trợ giúp bổ sung.

+0

Cảm ơn bạn đã phản hồi. Tôi tưởng tượng Tkinter có thể dễ sử dụng hơn. Vấn đề là tôi phải chạy từ xa đến máy chủ mà tôi phải ssh hai lần để có được vào, và máy chủ cuối cùng không được kết nối với internet (nó chứa thông tin nhạy cảm). Tôi nghĩ rằng nó có một thư viện Tkinter, vì vậy tôi sẽ phải kiểm tra điều đó. Bởi vì tôi phải chạy tất cả mọi thứ thông qua một thiết bị đầu cuối, tôi đoán tôi có thể ssh -X; ssh -X để có thể tạo môi trường cửa sổ. – Neal

Các vấn đề liên quan