執行環境:Windows終端機
目的:
想要實現驗證輸入是否有誤,如果有誤則將警告訊息顯示在下方,
然後不換行,繼續在原本的地方輸入,直到輸入無誤後,則將警告訊息刪除。
想要實現如PyInquirer套件功能,程式碼在下下方。
問題A: 不知道如何收回訊息,只能想到覆蓋的方法。
問題B: 輸入A正確後,繼續輸入B時,如果輸入錯誤,寫入警告訊息後,想要回到原本輸入位置,但是輸入位置數值為固定,所以光標會跑到上面去,所以不知道有什麼更好的辦法回到原本輸入位置。
第一次發問,請教各位大大。
目前的程式碼:
程式碼可能很蠢的地方很多,歡迎糾正。
# -*- coding: utf-8 -*-
import os
import sys
class Input_ask():
def __init__(self, Message):
self.Message = Message #提問內容
self.Input()
def Input(self):
try:
self.Reply = input(self.Message).strip()
self.Judge()
except KeyboardInterrupt:
sys.exit()
#判斷
def Judge(self):
if os.path.isfile(self.Reply) == True and self.Reply.strip() != "":
return self.Reply
else:
self.ShowError()
#顯示錯誤訊息
def ShowError(self):
#輸出錯誤訊息
sys.stderr.write("\n\n" + "\033[31m" + "請輸入正確的檔名" + "\033[0m")
#回到原本輸入位置(需修改)
sys.stdout.write("\033[%dH" % (3))
self.Input()
print("某某訊息...\n")
FileA = Input_ask("請輸入來源檔案名稱: ").Reply
print("\n" + FileA)
FileB = Input_ask("\n\n請輸入目的檔案名稱: ").Reply
print("\n" + FileB)
輸出畫面:
1.輸入錯誤,顯示警告訊息,但不換行,繼續在原本位置輸入
2.輸入正確後想把錯誤訊息收回,然後繼續輸入下一個
使用PyInquirer套件:
from PyInquirer import prompt
from prompt_toolkit.validation import Validator, ValidationError
from examples import custom_style_3 #美化用
class NumberValidator(Validator):
def validate(self, document):
try:
int(document.text)
except ValueError:
raise ValidationError(
message='Please enter a number', #警告訊息
cursor_position=len(document.text)) # Move cursor to end
questions = [
{
'type': 'input',
'name': 'quantity',
'message': 'How many do you need?', #輸入提示
'validate': NumberValidator, #輸入驗證(在上方)
'filter': lambda val: int(val)
}
]
answers = prompt(questions, style=custom_style_3)
print('Order receipt:')
print(answers)
輸出畫面:
1.輸入錯誤會顯示警告訊息,重新輸入時會自動刪除警告。
2.能輸出警告訊息,在原本位置繼續輸入
想要請問原理是什麼,如何實現的。