2011-08-30 33 views
7

Tôi muốn in một chuỗi để dòng lệnh/thiết bị đầu cuối trong Windows và sau đó chỉnh sửa/thay đổi chuỗi và đọc nó trở lại. Bất cứ ai cũng biết làm thế nào để làm điều đó? Cảm ơnPython: cách sửa đổi/chỉnh sửa chuỗi được in ra màn hình và đọc lại?

print "Hell" 
Hello! <---Edit it on the screen 
s = raw_input() 
print s 
Hello! 
+6

Nói chung, bạn không thể - stdout là chỉ ghi. Nếu bạn muốn sử dụng thiết bị đầu cuối làm bộ đệm có thể thay đổi, hãy sử dụng các lời nguyền hoặc in lại toàn bộ màn hình trên mọi lần lặp lại. – delnan

+2

Vâng, nếu bạn muốn một giải pháp bẩn sau đó bạn có thể thử các giải pháp in lại bằng cách móc lên '' sys.stdout'' với một đối tượng giống như tập tin tùy chỉnh. Nếu không, bạn phải dành chút thời gian để học tập thư viện '' curses''.Đây là một hướng dẫn hay về '' curses'': http://docs.python.org/howto/curses.html –

+0

Cảm ơn. vì vậy không có cách nào dễ dàng để làm điều này. lời nguyền không phải dành cho cửa sổ bằng cách này ... – TMS

Trả lời

2

Bạn có thể thực hiện một số thủ thuật ANSI để làm cho giao diện giống như bạn đang chỉnh sửa trên màn hình. Check out this link (cũng tương tự như this SO post on colors).

Điều này chỉ hoạt động trên một số thiết bị và cấu hình nhất định. ymmv.

python này kịch bản làm việc tại nhà ga Cygwin của tôi trên Win7:

print 'hell' 
print '\033[1A\033[4CO!' 

Kết thúc lên in hellO! trên cùng một dòng. Bản in thứ hai di chuyển con trỏ lên một dòng (Esc [1A) sau đó trên 4 ký tự (Esc [4C]) và sau đó in 'O!'.

Nó sẽ không cho phép bạn đọc lại dù ... chỉ một câu trả lời 1/2.

0

os.sys.stdout chỉ ghi, nhưng bạn có thể xóa một số ký tự của dòng cuối cùng với \b hoặc toàn bộ dòng với \r, miễn là bạn không viết trả lại hàng.

(tuy nhiên, xem thêm my question về hạn chế đối với các python console/thiết bị đầu cuối tiêu chuẩn)

Tôi đã từng thực hiện một số bài tập đầu ra (trong đó có một thanh trạng thái) để viết, xóa hoặc động nếu bạn sẽ, có lẽ nó là hữu ích :

from __future__ import print_function 
import sys, time 

# status generator 
def range_with_status(total): 
    n=0 
    while n<total: 
     done = '#'*(n+1) 
     todo = '-'*(total-n-1) 
     s = '<{0}>'.format(done+todo) 
     if not todo: 
      s+='\n' 
     if n>0: 
      s = '\r'+s 
     sys.stdout.write(s) 
     sys.stdout.flush() 
     yield n 
     n+=1 

print ('doing something ...') 
for i in range_with_status(10): 
    time.sleep(0.1) 

print('ready') 
time.sleep(0.4) 


print ('And now for something completely different ...') 
time.sleep(0.5) 
msg = 'I am going to erase this line from the console window.' 
sys.stdout.write(msg); sys.stdout.flush() 
time.sleep(1) 
sys.stdout.write('\r' + ' '*len(msg)) 
sys.stdout.flush() 
time.sleep(0.5) 
print('\rdid I succeed?') 
time.sleep(4) 
0

raw_input chấp nhận một tham số cho một "thông điệp nhắc nhở", do đó sử dụng để sản xuất các tin nhắn, và sau đó thêm vào trước nó với những gì bạn nhận lại. Tuy nhiên, điều này sẽ không cho phép bạn backspace vào dấu nhắc, bởi vì nó là một dấu nhắc và không thực sự là một phần của đầu vào.

s = "Hell" + raw_input("Hell") 
print s 
0

Nếu đó là cho mục đích riêng của mình, thì đây là một hack wee bẩn sử dụng clipboard mà không làm mất những gì đã có trước đây:

def edit_text_at_terminal(text_to_edit): 
    import pyperclip 

    # Save old clipboard contents so user doesn't lose them 
    old_clipboard_contents = pyperclip.paste() 

    #place text you want to edit in the clipboard 
    pyperclip.copy(text_to_edit) 

    # If you're on Windows, and ctrl+v works, you can do this: 
    import win32com.client 
    shell = win32com.client.Dispatch("WScript.Shell") 
    shell.SendKeys("^v") 

    # Otherwise you should tell the user to type ctrl+v 
    msg = "Type ctrl+v (your old clipboard contents will be restored):\n" 

    # Get the new value, the old value will have been pasted 
    new_value= str(raw_input(msg)) 

    # restore the old clipboard contents before returning new value 
    pyperclip.copy(old_clipboard_contents) 
    return new_value 

Lưu ý rằng ctrl + v không hoạt động trong tất cả các thiết bị đầu cuối, đáng chú ý là mặc định của Windows (có ways to make it work, mặc dù tôi khuyên bạn nên sử dụng ConEmu thay thế).

Tự động hóa tổ hợp phím cho các hệ điều hành khác sẽ liên quan đến một quá trình khác.

Hãy nhớ rằng đây là một bản hack nhanh và không phải là giải pháp "thích hợp". Tôi sẽ không chịu trách nhiệm về việc mất toàn bộ luận án tiến sĩ trong giây lát được lưu trữ trong clipboard của bạn. Đối với một giải pháp thích hợp, có các cách tiếp cận tốt hơn như curses cho Linux và trên Windows có giá trị là AutHotKey (có thể ném lên một hộp nhập liệu hoặc thực hiện một số thao tác gõ phím/clipboard). Quay lại đầu trang

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