2011-08-30 14 views
7

Windows'ta komut satırı/terminaline bir dize yazdırmak ve dizeyi düzenlemek/değiştirmek ve geri okumak istiyorum. Herkes bunu nasıl yapacağını biliyor mu? TeşekkürlerPython: Ekrana yazdırılan diziyi nasıl değiştirebilir/düzenleyebilir ve geri okuyabilirim?

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

Genel olarak konuşamazsınız - stdout sadece yazılır. Terminali değiştirilebilen arabellek olarak kullanmak isterseniz, küfür kullanın veya tüm ekranı her yinelemede yeniden yazdırın. – delnan

+2

Evet, kirli bir çözüm istiyorsanız, yeniden yazdırma çözümünü, '' sys.stdout'' özel bir dosya benzeri nesne ile bağlayarak deneyebilirsiniz. Aksi takdirde 'curses'' kütüphanesini öğrenirken biraz zaman geçirmelisiniz.İşte "curses" hakkında güzel bir öğretici: http://docs.python.org/howto/curses.html –

+0

Teşekkürler. bu yüzden bunu yapmanın kolay bir yolu yok. Bu arada küfürler Windows için değil ... – TMS

cevap

2

Ekranda düzenlediğiniz gibi görünmesini sağlamak için bazı ANSI hileleri yapabilirsiniz. Check out this link (this SO post on colors'a da benzer).

Bu yalnızca belirli terminallerde ve yapılandırmalarda çalışır. YMMV.

Bu python komut dosyası Win7 benim Cygwin terminali çalıştı:

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

bir satırda hellO! yazdırmayı sona erdirir. 2. baskı, imleci bir satır yukarı (Esc [1A), ardından 4 karakterden (Esc [4C]) yukarı taşır ve ardından 'O!'

Geri sadece bir 1/2 cevabı okumanıza izin vermez.

0

os.sys.stdout yalnızca yazılmıştır, ancak satır başı yazmadığınız sürece, \b ile son satırın bazı karakterlerini veya \r numaralı tüm satırı silebilirsiniz.

keresinde belki de yararlı olduğunu, silmek ya da eğer sen animasyon, yazmaya (bir durum çubuğunda dahil) bazı çıkış egzersiz yapılan (ancak, standart piton konsolu/terminale sınırlamaları hakkında da my question bakınız) :

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, bir "istemi mesajın" için bir parametre kabul yüzden çıkış mesajı için kullanabilirsiniz ve sonra geri almak ne onu getirebilirsiniz. Ancak, bu bilgi istemine geri dönmenize izin vermeyecektir, çünkü bu, girişin gerçekten bir parçası değildir. Ctrl + v tüm terminallerde çalışmadığını

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 

Not: Kendi amaçları için ise

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

, daha sonra burada önce orada ne kaybetmeden panosunu kullanarak kirli çiş beygir özellikle Windows varsayılanı (ConEmu kullanmanızı tavsiye etsem de ways to make it work vardır).

Diğer işletim sistemleri için tuş vuruşlarını otomatikleştirmek farklı bir işlem gerektirir.

Lütfen bu "hızlı" bir çözüm değil, hızlı bir kesmek olduğunu unutmayın. Panoda anlık olarak saklanan doktora tezlerinin tamamından sorumlu tutulmayacağım.

Uygun bir çözüm için, Linux için curses gibi daha iyi yaklaşımlar vardır ve Windows'da AutHotKey'a bakmaya değer (belki de bir giriş kutusu veya bazı tuş vuruşlarını/pano sihirbazlarını yapın).

İlgili konular