Lời nguyền lập trình với Python¶
- tác giả:
A.M. Kuchling, Eric S. Raymond
- Phát hành:
2.04
lời nguyền là gì?¶
Thư viện lời nguyền cung cấp cơ sở xử lý bàn phím và vẽ màn hình độc lập với thiết bị đầu cuối cho các thiết bị đầu cuối dựa trên văn bản; các thiết bị đầu cuối như vậy bao gồm VT100, bảng điều khiển Linux và thiết bị đầu cuối mô phỏng được cung cấp bởi các chương trình khác nhau. Thiết bị đầu cuối hiển thị hỗ trợ nhiều mã điều khiển khác nhau để thực hiện các thao tác thông thường như di chuyển con trỏ, cuộn màn hình và xóa các vùng. Các thiết bị đầu cuối khác nhau sử dụng các mã rất khác nhau và thường có những điểm kỳ quặc riêng.
Trong thế giới hiển thị đồ họa, người ta có thể hỏi "tại sao phải bận tâm"? Đúng là thiết bị đầu cuối hiển thị ô ký tự là một công nghệ lỗi thời, nhưng có những lĩnh vực mà việc có thể làm những điều lạ mắt với chúng vẫn có giá trị. Một vị trí thích hợp dành cho các Unix có dung lượng nhỏ hoặc được nhúng không chạy máy chủ X. Một cách khác là các công cụ như trình cài đặt hệ điều hành và bộ cấu hình hạt nhân có thể phải chạy trước khi có bất kỳ hỗ trợ đồ họa nào.
Thư viện lời nguyền cung cấp chức năng khá cơ bản, cung cấp cho người lập trình sự trừu tượng của một màn hình chứa nhiều cửa sổ văn bản không chồng chéo. Nội dung của một cửa sổ có thể được thay đổi theo nhiều cách khác nhau --- thêm văn bản, xóa văn bản, thay đổi giao diện --- và thư viện lời nguyền sẽ tìm ra những mã kiểm soát nào cần được gửi đến thiết bị đầu cuối để tạo ra kết quả đầu ra phù hợp. lời nguyền không cung cấp nhiều khái niệm giao diện người dùng như nút, hộp kiểm hoặc hộp thoại; nếu bạn cần những tính năng như vậy, hãy xem xét thư viện giao diện người dùng như Urwid.
Thư viện lời nguyền ban đầu được viết cho BSD Unix; các phiên bản System V sau này của Unix của AT&T đã bổ sung thêm nhiều cải tiến và chức năng mới. Lời nguyền BSD không còn được duy trì nữa mà được thay thế bằng ncurses, đây là một triển khai mã nguồn mở của giao diện AT&T. Nếu bạn đang sử dụng Unix nguồn mở như Linux hoặc FreeBSD, hệ thống của bạn gần như chắc chắn sử dụng ncurses. Vì hầu hết các phiên bản Unix thương mại hiện tại đều dựa trên mã System V nên tất cả các chức năng được mô tả ở đây có thể sẽ khả dụng. Tuy nhiên, các phiên bản cũ hơn của lời nguyền do một số Unix độc quyền mang theo có thể không hỗ trợ mọi thứ.
Phiên bản Windows của Python không bao gồm mô-đun curses. Đã có sẵn phiên bản port có tên UniCurses.
Mô-đun nguyền rủa Python¶
Mô-đun Python là một trình bao bọc khá đơn giản đối với các hàm C do lời nguyền cung cấp; Nếu bạn đã quen với việc lập trình Curs trong C thì việc chuyển kiến thức đó sang Python thực sự rất dễ dàng. Sự khác biệt lớn nhất là giao diện Python làm cho mọi thứ đơn giản hơn bằng cách hợp nhất các hàm C khác nhau như addstr(), mvaddstr() và mvwaddstr() thành một phương thức addstr() duy nhất. Bạn sẽ thấy điều này được đề cập chi tiết hơn sau này.
Zz000zz này là phần giới thiệu về cách viết chương trình ở chế độ văn bản bằng lời nguyền và Python. Nó không cố gắng trở thành một hướng dẫn đầy đủ về những lời nguyền API; để biết điều đó, hãy xem phần hướng dẫn thư viện Python về ncurses và các trang hướng dẫn sử dụng C cho ncurses. Tuy nhiên, nó sẽ cung cấp cho bạn những ý tưởng cơ bản.
Bắt đầu và kết thúc một ứng dụng nguyền rủa¶
Trước khi làm bất cứ điều gì, lời nguyền phải được khởi tạo. Điều này được thực hiện bằng cách gọi hàm initscr(), hàm này sẽ xác định loại thiết bị đầu cuối, gửi mọi mã thiết lập cần thiết đến thiết bị đầu cuối và tạo các cấu trúc dữ liệu nội bộ khác nhau. Nếu thành công, initscr() trả về một đối tượng cửa sổ đại diện cho toàn bộ màn hình; cái này thường được gọi là stdscr theo tên của biến C tương ứng.
lời nguyền nhập khẩu
stdscr = lời nguyền.initscr()
Thông thường, các ứng dụng chửi bới sẽ tắt tính năng tự động lặp lại các phím trên màn hình để có thể đọc các phím và chỉ hiển thị chúng trong một số trường hợp nhất định. Điều này yêu cầu gọi hàm noecho().
lời nguyền.noecho()
Các ứng dụng cũng thường cần phản ứng với các phím ngay lập tức mà không cần nhấn phím Enter; đây được gọi là chế độ cbreak, trái ngược với chế độ đầu vào được đệm thông thường.
lời nguyền.cbreak()
Thiết bị đầu cuối thường trả về các phím đặc biệt, chẳng hạn như phím con trỏ hoặc phím điều hướng như Page Up và Home, dưới dạng chuỗi thoát nhiều byte. Mặc dù bạn có thể viết ứng dụng của mình để mong đợi các chuỗi như vậy và xử lý chúng cho phù hợp, nhưng lời nguyền có thể làm điều đó cho bạn, trả về một giá trị đặc biệt, chẳng hạn như curses.KEY_LEFT. Để nhận được những lời nguyền thực hiện công việc, bạn sẽ phải bật chế độ bàn phím.
stdscr.keypad(Đúng)
Việc chấm dứt một ứng dụng nguyền rủa dễ dàng hơn nhiều so với việc bắt đầu một ứng dụng. Bạn sẽ cần gọi:
lời nguyền.nocbreak()
stdscr.keypad(Sai)
lời nguyền.echo()
để đảo ngược cài đặt thiết bị đầu cuối thân thiện với lời nguyền. Sau đó gọi hàm endwin() để khôi phục thiết bị đầu cuối về chế độ hoạt động ban đầu.
lời nguyền.endwin()
Một vấn đề phổ biến khi gỡ lỗi ứng dụng bị nguyền rủa là khiến thiết bị đầu cuối của bạn bị lỗi khi ứng dụng chết mà không khôi phục thiết bị đầu cuối về trạng thái trước đó. Trong Python, điều này thường xảy ra khi mã của bạn bị lỗi và gây ra một ngoại lệ chưa được phát hiện. Chẳng hạn, các phím không còn bị lặp lại trên màn hình khi bạn gõ chúng, điều này khiến việc sử dụng shell trở nên khó khăn.
Trong Python, bạn có thể tránh những rắc rối này và giúp việc gỡ lỗi dễ dàng hơn nhiều bằng cách nhập hàm curses.wrapper() và sử dụng nó như sau:
từ trình bao bọc nhập khẩu lời nguyền
def chính (stdscr):
màn hình # Clear
stdscr.clear()
# This tăng ZeroDivisionError khi i == 10.
cho tôi trong phạm vi (0, 11):
v = i-10
stdscr.addstr(i, 0, '10 chia cho {} là {}'.format(v, 10/v))
stdscr.refresh()
stdscr.getkey()
trình bao bọc (chính)
Hàm wrapper() nhận một đối tượng có thể gọi được và thực hiện các khởi tạo được mô tả ở trên, đồng thời khởi tạo các màu nếu có hỗ trợ màu. wrapper() sau đó chạy lệnh gọi được cung cấp của bạn. Sau khi có thể gọi trở lại, wrapper() sẽ khôi phục trạng thái ban đầu của thiết bị đầu cuối. Hàm có thể gọi được gọi bên trong try...except để bắt ngoại lệ, khôi phục trạng thái của thiết bị đầu cuối và sau đó tăng lại ngoại lệ. Do đó, thiết bị đầu cuối của bạn sẽ không ở trạng thái buồn cười về ngoại lệ và bạn sẽ có thể đọc thông báo và truy nguyên của ngoại lệ.
Windows và miếng đệm¶
Windows là sự trừu tượng cơ bản trong những lời nguyền. Đối tượng cửa sổ đại diện cho một vùng hình chữ nhật của màn hình và hỗ trợ các phương thức hiển thị văn bản, xóa văn bản, cho phép người dùng nhập chuỗi, v.v.
Đối tượng stdscr được hàm initscr() trả về là đối tượng cửa sổ bao phủ toàn bộ màn hình. Nhiều chương trình có thể chỉ cần một cửa sổ duy nhất này, nhưng bạn có thể muốn chia màn hình thành các cửa sổ nhỏ hơn để vẽ lại hoặc xóa chúng một cách riêng biệt. Hàm newwin() tạo một cửa sổ mới có kích thước nhất định, trả về đối tượng cửa sổ mới.
bắt đầu_x = 20; bắt đầu_y = 7
chiều cao = 5; chiều rộng = 40
win =curs.newwin(chiều cao, chiều rộng,bắt đầu_y,bắt đầu_x)
Lưu ý rằng hệ tọa độ được sử dụng trong lời nguyền là không bình thường. Tọa độ luôn được chuyển theo thứ tự y,x và góc trên cùng bên trái của cửa sổ là tọa độ (0,0). Điều này phá vỡ quy ước thông thường để xử lý tọa độ trong đó tọa độ x xuất hiện trước. Đây là một sự khác biệt đáng tiếc so với hầu hết các ứng dụng máy tính khác, nhưng nó đã là một phần của những lời nguyền kể từ khi nó được viết lần đầu tiên và bây giờ đã quá muộn để thay đổi mọi thứ.
Ứng dụng của bạn có thể xác định kích thước của màn hình bằng cách sử dụng các biến curses.LINES và curses.COLS để thu được kích thước y và x. Tọa độ pháp lý sau đó sẽ mở rộng từ (0,0) đến (curses.LINES - 1, curses.COLS - 1).
Khi bạn gọi một phương thức để hiển thị hoặc xóa văn bản, hiệu ứng sẽ không hiển thị ngay trên màn hình. Thay vào đó bạn phải gọi phương thức refresh() của đối tượng cửa sổ để cập nhật màn hình.
Điều này là do những lời nguyền ban đầu được viết với mục đích kết nối thiết bị đầu cuối chậm 300 baud; với các thiết bị đầu cuối này, việc giảm thiểu thời gian cần thiết để vẽ lại màn hình là rất quan trọng. Thay vào đó, những lời nguyền sẽ tích lũy những thay đổi trên màn hình và hiển thị chúng theo cách hiệu quả nhất khi bạn gọi refresh(). Ví dụ: nếu chương trình của bạn hiển thị một số văn bản trong một cửa sổ và sau đó xóa cửa sổ đó thì không cần phải gửi văn bản gốc vì chúng không bao giờ hiển thị.
Trong thực tế, việc yêu cầu rõ ràng các lời nguyền để vẽ lại một cửa sổ không thực sự làm phức tạp nhiều việc lập trình với các lời nguyền. Hầu hết các chương trình bắt đầu thực hiện một loạt hoạt động và sau đó tạm dừng chờ người dùng nhấn phím hoặc một số hành động khác. Tất cả những gì bạn phải làm là đảm bảo rằng màn hình đã được vẽ lại trước khi tạm dừng để chờ người dùng nhập liệu bằng cách gọi stdscr.refresh() hoặc phương thức refresh() của một số cửa sổ liên quan khác trước tiên.
Một miếng đệm là một trường hợp đặc biệt của một cửa sổ; nó có thể lớn hơn màn hình hiển thị thực tế và mỗi lần chỉ hiển thị một phần của bảng. Việc tạo một bảng cần có chiều cao và chiều rộng của bảng, trong khi làm mới một bảng yêu cầu cung cấp tọa độ của khu vực trên màn hình nơi phần phụ của bảng sẽ được hiển thị.
pad = lời nguyền.newpad(100, 100)
Các vòng lặp # These điền vào bảng các chữ cái; addch() là
# explained ở phần tiếp theo
cho y trong phạm vi (0, 99):
cho x trong phạm vi (0, 99):
pad.addch(y,x, ord('a') + (x*x+y*y) % 26)
# Displays một phần của pad ở giữa màn hình.
# (0,0): tọa độ góc trên bên trái của vùng pad cần hiển thị.
# (5,5): tọa độ góc trên bên trái của vùng cửa sổ cần điền
nội dung bảng # with.
# (20, 75) : tọa độ góc dưới bên phải của vùng cửa sổ cần làm
# : chứa đầy nội dung pad.
pad.refresh( 0,0, 5,5, 20,75)
Lệnh gọi refresh() hiển thị một phần của phần đệm trong hình chữ nhật kéo dài từ tọa độ (5,5) đến tọa độ (20,75) trên màn hình; góc trên bên trái của phần hiển thị là tọa độ (0,0) trên pad. Ngoài sự khác biệt đó, các miếng đệm giống hệt như các cửa sổ thông thường và hỗ trợ các phương pháp tương tự.
Nếu bạn có nhiều cửa sổ và miếng đệm trên màn hình, có một cách hiệu quả hơn để cập nhật màn hình và ngăn chặn hiện tượng nhấp nháy màn hình khó chịu khi mỗi phần của màn hình được cập nhật. refresh() thực sự làm hai việc:
Gọi phương thức
noutrefresh()của mỗi cửa sổ để cập nhật cấu trúc dữ liệu cơ bản thể hiện trạng thái mong muốn của màn hình.Gọi hàm
doupdate()để thay đổi màn hình vật lý phù hợp với trạng thái mong muốn được ghi trong cấu trúc dữ liệu.
Thay vào đó, bạn có thể gọi noutrefresh() trên một số cửa sổ để cập nhật cấu trúc dữ liệu, sau đó gọi doupdate() để cập nhật màn hình.
Hiển thị văn bản¶
Theo quan điểm của một lập trình viên C, những lời nguyền đôi khi có thể trông giống như một mê cung ngoằn ngoèo của các hàm, tất cả đều khác nhau một cách tinh tế. Ví dụ: addstr() hiển thị một chuỗi tại vị trí con trỏ hiện tại trong cửa sổ stdscr, trong khi mvaddstr() di chuyển đến tọa độ y, x nhất định trước khi hiển thị chuỗi. waddstr() cũng giống như addstr() nhưng cho phép chỉ định một cửa sổ để sử dụng thay vì sử dụng stdscr theo mặc định. mvwaddstr() cho phép chỉ định cả cửa sổ và tọa độ.
May mắn thay giao diện Python ẩn tất cả những chi tiết này. stdscr là một đối tượng cửa sổ giống như bất kỳ đối tượng nào khác và các phương thức như addstr() chấp nhận nhiều dạng đối số. Thông thường có bốn hình thức khác nhau.
biểu mẫu |
Mô tả |
|---|---|
str hoặc ch |
Hiển thị chuỗi str hoặc ký tự ch tại vị trí hiện tại |
str hoặc ch, attr |
Hiển thị chuỗi str hoặc ký tự ch, sử dụng thuộc tính attr tại vị trí hiện tại |
y, x, str hoặc ch |
Di chuyển đến vị trí y,x trong cửa sổ và hiển thị str hoặc ch |
y, x, str hoặc ch, attr |
Di chuyển đến vị trí y,x trong cửa sổ và hiển thị str hoặc ch, sử dụng thuộc tính attr |
Thuộc tính cho phép hiển thị văn bản ở dạng nổi bật như in đậm, gạch chân, đảo mã hoặc màu. Chúng sẽ được giải thích chi tiết hơn trong tiểu mục tiếp theo.
Phương thức addstr() lấy chuỗi Python hoặc chuỗi byte làm giá trị được hiển thị. Nội dung của chuỗi byte được gửi đến thiết bị đầu cuối nguyên trạng. Các chuỗi được mã hóa thành byte bằng cách sử dụng giá trị thuộc tính encoding của cửa sổ; điều này mặc định là mã hóa hệ thống mặc định được trả về bởi locale.getencoding().
Các phương thức addch() lấy một ký tự, có thể là một chuỗi có độ dài 1, một chuỗi byte có độ dài 1 hoặc một số nguyên.
Các hằng số được cung cấp cho các ký tự mở rộng; các hằng số này là số nguyên lớn hơn 255. Ví dụ: ACS_PLMINUS là ký hiệu +/- và ACS_ULCORNER là góc trên bên trái của hộp (tiện dụng để vẽ đường viền). Bạn cũng có thể sử dụng ký tự Unicode thích hợp.
Windows ghi nhớ vị trí con trỏ được để lại sau thao tác cuối cùng, vì vậy nếu bạn bỏ tọa độ y,x, chuỗi hoặc ký tự sẽ được hiển thị ở bất kỳ vị trí nào mà thao tác cuối cùng đã dừng lại. Bạn cũng có thể di chuyển con trỏ bằng phương pháp move(y,x). Vì một số thiết bị đầu cuối luôn hiển thị con trỏ nhấp nháy nên bạn có thể muốn đảm bảo rằng con trỏ được đặt ở vị trí nào đó mà nó không gây mất tập trung; có thể gây nhầm lẫn khi con trỏ nhấp nháy ở một vị trí có vẻ ngẫu nhiên nào đó.
Nếu ứng dụng của bạn hoàn toàn không cần con trỏ nhấp nháy, bạn có thể gọi curs_set(False) để ẩn nó. Để tương thích với các phiên bản lời nguyền cũ hơn, có chức năng leaveok(bool) đồng nghĩa với curs_set(). Khi bool là đúng, thư viện lời nguyền sẽ cố gắng chặn con trỏ nhấp nháy và bạn sẽ không cần phải lo lắng về việc để nó ở những vị trí kỳ lạ.
Thuộc tính và màu sắc¶
Các ký tự có thể được hiển thị theo nhiều cách khác nhau. Các dòng trạng thái trong ứng dụng dựa trên văn bản thường được hiển thị trong video đảo ngược hoặc người xem văn bản có thể cần đánh dấu một số từ nhất định. lời nguyền hỗ trợ điều này bằng cách cho phép bạn chỉ định một thuộc tính cho từng ô trên màn hình.
Thuộc tính là một số nguyên, mỗi bit đại diện cho một thuộc tính khác nhau. Bạn có thể cố gắng hiển thị văn bản với nhiều bit thuộc tính được đặt, nhưng lời nguyền không đảm bảo rằng tất cả các kết hợp có thể đều có sẵn hoặc tất cả chúng đều khác biệt về mặt trực quan. Điều đó phụ thuộc vào khả năng sử dụng của thiết bị đầu cuối, vì vậy, cách an toàn nhất là tuân theo các thuộc tính sẵn có phổ biến nhất được liệt kê ở đây.
Thuộc tính |
Mô tả |
|---|---|
Văn bản nhấp nháy |
|
Văn bản cực sáng hoặc đậm |
|
Văn bản nửa sáng |
|
Văn bản đảo ngược video |
|
Chế độ đánh dấu tốt nhất hiện có |
|
văn bản được gạch chân |
Vì vậy, để hiển thị dòng trạng thái video đảo ngược ở dòng trên cùng của màn hình, bạn có thể mã
stdscr.addstr(0, 0, "Chế độ hiện tại: Chế độ gõ",
lời nguyền.A_REVERSE)
stdscr.refresh()
Thư viện lời nguyền cũng hỗ trợ màu sắc trên các thiết bị đầu cuối cung cấp nó. Thiết bị đầu cuối phổ biến nhất có lẽ là bảng điều khiển Linux, tiếp theo là xterm màu.
Để sử dụng màu, bạn phải gọi hàm start_color() ngay sau khi gọi initscr(), để khởi tạo bộ màu mặc định (hàm curses.wrapper() thực hiện việc này một cách tự động). Khi đã xong, hàm has_colors() trả về TRUE nếu thiết bị đầu cuối đang sử dụng thực sự có thể hiển thị màu. (Lưu ý: những lời nguyền sử dụng cách đánh vần 'màu' của người Mỹ, thay vì cách đánh vần 'màu' của người Canada/Anh. Nếu bạn đã quen với cách đánh vần của người Anh, bạn sẽ phải chấp nhận viết sai chính tả vì lợi ích của các chức năng này.)
Thư viện lời nguyền duy trì một số cặp màu hữu hạn, chứa màu nền trước (hoặc văn bản) và màu nền. Bạn có thể lấy giá trị thuộc tính tương ứng với một cặp màu bằng hàm color_pair(); điều này có thể được HOẶC bitwise với các thuộc tính khác như A_REVERSE, nhưng một lần nữa, những kết hợp như vậy không được đảm bảo hoạt động trên tất cả các thiết bị đầu cuối.
Ví dụ hiển thị dòng văn bản sử dụng cặp màu 1:
stdscr.addstr("Văn bản đẹp", lời nguyền.color_pair(1))
stdscr.refresh()
Như tôi đã nói trước đây, một cặp màu bao gồm màu nền trước và màu nền. Hàm init_pair(n, f, b) thay đổi định nghĩa của cặp màu n, thành màu nền trước f và màu nền b. Cặp màu 0 được cố định thành màu trắng trên nền đen và không thể thay đổi.
Màu sắc được đánh số và start_color() khởi tạo 8 màu cơ bản khi kích hoạt chế độ màu. Đó là: 0:đen, 1:đỏ, 2:xanh lục, 3:vàng, 4:xanh lam, 5:đỏ tươi, 6:lục lam và 7:trắng. Mô-đun curses xác định các hằng số được đặt tên cho từng màu sau: curses.COLOR_BLACK, curses.COLOR_RED, v.v.
Hãy đặt tất cả những điều này lại với nhau. Để thay đổi màu 1 thành văn bản màu đỏ trên nền trắng, bạn sẽ gọi:
lời nguyền.init_pair(1, lời nguyền.COLOR_RED, lời nguyền.COLOR_WHITE)
Khi bạn thay đổi một cặp màu, mọi văn bản đã được hiển thị bằng cặp màu đó sẽ chuyển sang màu mới. Bạn cũng có thể hiển thị văn bản mới bằng màu này với:
stdscr.addstr(0,0, "RED ALERT!", Curs.color_pair(1))
Các thiết bị đầu cuối rất lạ mắt có thể thay đổi định nghĩa của màu thực tế thành giá trị RGB nhất định. Điều này cho phép bạn thay đổi màu 1, thường là màu đỏ, sang màu tím hoặc xanh hoặc bất kỳ màu nào khác mà bạn thích. Thật không may, bảng điều khiển Linux không hỗ trợ điều này, vì vậy tôi không thể dùng thử và không thể cung cấp bất kỳ ví dụ nào. Bạn có thể kiểm tra xem thiết bị đầu cuối của mình có thể thực hiện việc này hay không bằng cách gọi can_change_color(), trả về True nếu có khả năng. Nếu bạn đủ may mắn để có một thiết bị đầu cuối tài năng như vậy, hãy tham khảo trang hướng dẫn sử dụng hệ thống của bạn để biết thêm thông tin.
Đầu vào của người dùng¶
Thư viện Ccurs chỉ cung cấp các cơ chế nhập liệu rất đơn giản. Mô-đun curses của Python thêm tiện ích nhập văn bản cơ bản. (Các thư viện khác như Urwid có bộ sưu tập tiện ích phong phú hơn.)
Có hai phương pháp để nhận dữ liệu đầu vào từ cửa sổ:
getch()làm mới màn hình rồi đợi người dùng nhấn một phím, hiển thị phím nếuecho()đã được gọi trước đó. Bạn có thể tùy ý chỉ định tọa độ mà con trỏ sẽ được di chuyển tới trước khi tạm dừng.getkey()thực hiện tương tự nhưng chuyển đổi số nguyên thành chuỗi. Các ký tự riêng lẻ được trả về dưới dạng chuỗi 1 ký tự và các phím đặc biệt như phím chức năng trả về các chuỗi dài hơn chứa tên khóa nhưKEY_UPhoặc^G.
Có thể không đợi người dùng sử dụng phương pháp cửa sổ nodelay(). Sau nodelay(True), getch() và getkey() cho cửa sổ trở thành không chặn. Để báo hiệu rằng chưa có đầu vào nào sẵn sàng, getch() trả về curses.ERR (giá trị -1) và getkey() đưa ra một ngoại lệ. Ngoài ra còn có chức năng halfdelay(), có thể được sử dụng để (trên thực tế) đặt bộ hẹn giờ trên mỗi getch(); nếu không có đầu vào nào khả dụng trong một độ trễ xác định (được đo bằng phần mười giây), những lời nguyền sẽ đưa ra một ngoại lệ.
Phương thức getch() trả về một số nguyên; nếu nằm trong khoảng từ 0 đến 255, nó đại diện cho mã ASCII của phím được nhấn. Giá trị lớn hơn 255 là các phím đặc biệt như Page Up, Home hoặc các phím con trỏ. Bạn có thể so sánh giá trị được trả về cho các hằng số như curses.KEY_PPAGE, curses.KEY_HOME hoặc curses.KEY_LEFT. Vòng lặp chính của chương trình của bạn có thể trông giống như thế này:
trong khi Đúng:
c = stdscr.getch()
nếu c == ord('p'):
Tài liệu in()
Elif c == ord('q'):
phá vỡ # Exit vòng lặp while
Elif c == lời nguyền.KEY_HOME:
x = y = 0
Mô-đun curses.ascii cung cấp các hàm thành viên của lớp ASCII nhận đối số chuỗi số nguyên hoặc chuỗi 1 ký tự; những điều này có thể hữu ích trong việc viết các bài kiểm tra dễ đọc hơn cho các vòng lặp như vậy. Nó cũng cung cấp các hàm chuyển đổi lấy đối số là số nguyên hoặc chuỗi 1 ký tự và trả về cùng loại. Ví dụ: curses.ascii.ctrl() trả về ký tự điều khiển tương ứng với đối số của nó.
Ngoài ra còn có một phương pháp để truy xuất toàn bộ chuỗi, getstr(). Nó không được sử dụng thường xuyên vì chức năng của nó khá hạn chế; các phím chỉnh sửa duy nhất có sẵn là phím xóa lùi và phím Enter để kết thúc chuỗi. Nó có thể tùy ý được giới hạn ở một số ký tự cố định.
lời nguyền.echo() # Enable tiếng vang của các ký tự
# Get một chuỗi 15 ký tự, với con trỏ ở dòng trên cùng
s = stdscr.getstr(0,0, 15)
Mô-đun curses.textpad cung cấp một hộp văn bản hỗ trợ bộ tổ hợp phím giống như Emacs. Các phương pháp khác nhau của lớp Textbox hỗ trợ chỉnh sửa bằng xác thực đầu vào và thu thập kết quả chỉnh sửa có hoặc không có dấu cách. Đây là một ví dụ:
lời nguyền nhập khẩu
từ lời nguyền.textpad nhập Hộp văn bản, hình chữ nhật
def chính (stdscr):
stdscr.addstr(0, 0, "Nhập tin nhắn IM: (nhấn Ctrl-G để gửi)")
editwin =curs.newwin(5,30, 2,1)
hình chữ nhật(stdscr, 1,0, 1+5+1, 1+30+1)
stdscr.refresh()
box = Hộp văn bản(editwin)
# Let người dùng chỉnh sửa cho đến khi nhấn Ctrl-G.
box.edit()
nội dung kết quả # Get
tin nhắn = box.gather()
Xem tài liệu thư viện trên curses.textpad để biết thêm chi tiết.
Để biết thêm thông tin¶
Zz001zz này không đề cập đến một số chủ đề nâng cao, chẳng hạn như đọc nội dung của màn hình hoặc ghi lại các sự kiện chuột từ một phiên bản xterm, nhưng trang thư viện Python cho mô-đun curses hiện đã hoàn thiện một cách hợp lý. Bạn nên duyệt nó tiếp theo.
Nếu bạn nghi ngờ về cách hoạt động chi tiết của các chức năng của lời nguyền, hãy tham khảo các trang hướng dẫn để triển khai lời nguyền của bạn, cho dù đó là ncurses hay của nhà cung cấp Unix độc quyền. Các trang hướng dẫn sẽ ghi lại mọi điểm kỳ quặc và cung cấp danh sách đầy đủ tất cả các chức năng, thuộc tính và ký tự ACS_* có sẵn cho bạn.
Vì lời nguyền API quá lớn nên một số chức năng không được hỗ trợ trong giao diện Python. Thường thì điều này không phải vì chúng khó thực hiện mà vì chưa có ai cần đến chúng. Ngoài ra, Python chưa hỗ trợ thư viện menu liên quan đến ncurses. Các bản vá bổ sung hỗ trợ cho những điều này sẽ được hoan nghênh; xem the Python Developer's Guide để tìm hiểu thêm về cách gửi bản vá tới Python.
Writing Programs with NCURSES: hướng dẫn dài dành cho lập trình viên C.
"Use curses... don't swear": video buổi nói chuyện PyCon 2013 về việc điều khiển thiết bị đầu cuối bằng cách sử dụng lời nguyền hoặc Urwid.
"Console Applications with Urwid": video buổi nói chuyện PyCon CA 2012 trình diễn một số ứng dụng được viết bằng Urwid.