2013-10-24 77 views
3

假設我們是在python3.3和多平臺(Linux和窗口),我要是以下:輸入(...)後提示%?

>>> eval(input("enter a percent from 1-100")) 

我得到:

enter a percent from 1-100: (Terminal is Waiting for user prompt) 

我希望它顯示:

enter a percent from 1-100: (waiting for user prompt) % 

如何在圓括號後面顯示%

+0

這根本無法完成。 – arshajii

+0

這是在Windows還是Linux?你可以看看windows上的'console'模塊。可以辦到。 – simonzack

+0

我在Linux上編寫這個腳本。 – user105951

回答

2

如果我理解你的問題,你希望能夠寫一個提示,包括%符號字符,但用戶的光標定位到符號的左邊,這樣的:

Enter a percent from 1-100:  % 
          ^cursor is here 

這裏沒有這是一個通用的解決方案,因爲基本的文本IO通常圍繞沒有明確定義的交互的輸入和輸出流。有些方法可以在某些情況下起作用,但在其他情況下卻不起作用,但我不確定任何可以在任何地方工作的任何東西(僅限於編寫GUI)。

我的一個建議是在您的提示中包含ASCII(和unicode)退格字符'\b'(或'\x08')。在一些控制檯上,這會將光標移動到每個退格的左側一個字符處。

input("Enter a percent from 1-100:  %\b\b\b\b\b") 

這時候我從窗戶CMD.exe shell中運行Python的工作,而不是當我IDLE中運行它('\x08'字符顯示爲一個框,一個小圓圈:那麼,可以通過以下方式產生上面的提示從中間取出)。這有點粗糙,因爲它不能阻止用戶輸入比%(將被輸入的第五個字符覆蓋)之前的空格多的字符。

另一種可能更健壯(但不是跨平臺,唉)的解決方案是使用curses module。我對代碼建議不夠熟悉,但應該可以讓它按照自己的意願進行操作(甚至可以控制諸如防止用戶輸入三個以上的字符,或者移動%符號以正確對齊值任何長度)。

最後一件事:我強烈建議您不要在您的input調用周圍使用eval。如果您期望(並要求)整數值,請使用int(input())。如果你可能會得到一個整數,也可以得到一些其他類型的值,可以使用多行來測試你得到了什麼:

def get_val(): 
    str_val = input() 
    try: 
     return int(str_val) # handle numbers like 1, 23232, etc. 
    except ValueError: 
     pass 

    try: 
     return float(str_val) # handles 23.5 and -3e-3 (but beware, also "nan" and "inf") 
    except ValueError: 
     pass 

    try: 
     return make_some_other_value(str_val) # whatever you want 
    except ValueError: 
     pass 

    return str_val # give up and return the string 
+1

哦,我想'\ b'字符會刪除百分號字符? – justhalf

+1

@justhalf:它取決於終端的功能,但我不認爲當退格字符被打印時,大多數系統都會刪除它。如果他們工作(而不是打印轉義代碼或其他東西),他們只是備份光標位置,這將允許您覆蓋的東西,如果你想。 (例如spinner:'while True:for c in'/ - \ |':print(c,end =「\ b」,flush = True); sleep(.25)')。 – Blckknght

2

下面是一個使用getch包的替代品。我們將推出自己的產品,而不是使用input

import string 
import sys 
try: 
    from msvcrt import getch 
except ImportError: 
    from getch import getch 


def char_valid(char): 
    """Do whatever validation you need here.""" 
    return char in string.ascii_letters or char in string.digits 


def char_bkspace(char): 
    """Matches backspace and delete.""" 
    return char in ['\x08', '\x7f'] 

message_pre = 'enter a percent from 1-100' 
message_post = '%' 
user_input = '' 
while True: 
    sys.stdout.write('\r{0} {1} {2}'.format(message_pre, user_input, message_post)) 
    char = getch() 
    if char_bkspace(char): 
     user_input = user_input[:-1] 
    elif char_valid(char): 
     user_input += char 
    else: 
     break 

print('\nyour message was', user_input) 

此使用getch獲取用戶輸入的一個字符在一個while循環的時間。通過使用sys.stdout.write('\r...'),我們可以避免換行並不斷覆蓋前一行。

這有一個問題,如果你退格,多個%將是可見的,因爲新行不會完全覆蓋上一行。這可以通過用空格填充字符串來解決。