2015-01-16 2 views
2

У меня есть программа, которая comminucate с пользователем. Я беру данные от пользователя с input(), но, я хочу сказать пользователю, например, если пользователь вводит ругательство, я хочу напечатать You are swearing! Delete it immediately!, а пользователь печатает.Как подключить функцию ввода(), когда вход() находится в движении

Как вы знаете, во-первых, Python ждет до input(). Моя цель - доступ к input(), прежде чем это будет сделано, тогда я смогу напечатать You are swearing! Delete it immediately! во время ввода пользователем.

В моей программе слишком много диктов и функций, поэтому я собираюсь написать пример, имеющий отношение к моей основной проблеме.

print ("Let's talk..") 
isim=input("What's your name?: ") 
print ("Hi there {}.".format(isim)) 

no=["badwords","morebadwords"] 

while True: 
    user=input(u">>>{}: ".format(isim)).lower() 
    for ct in user.split(): 
     if ct in no: 
      print ("You are swearing! Delete it immediately! ") 

Но это не работает, потому что Python ждет первый пока user вход не будет сделано. Как я могу это сделать пока пользователь печатает? -Python 3.4, Windows-

+5

Я думаю, это поможет вам. http://stackoverflow.com/questions/510357/python-read-a-single-character-from-the-user – eran

+0

Это не так просто, потому что нет встроенного способа получения штрихов по терминал/командная строка. Кроме того, вы подходите неправильно, потому что он запретил бы вводить такие слова, как «актив», потому что он начинается с осла ... это может быть исправлено, но, в конце концов, я бы не стал беспокоиться. Потому что я бы просто использовал $$, и все будет сделано. Если то, что вы хотите, может быть сделано, кто-то будет миллиардером из-за ее идеального фильтра спама ...;) – deets

+0

@eran Я не знаю, как использовать это в конкретном списке и как поместить его в мою программу. Честно говоря, первый раз я вижу такой класс. –

ответ

2

У меня нет большого опыта в этом, вы, вероятно, можете найти какой-то пакет, чтобы делать то, что хотите. Но, в общем, вам нужно реализовать некоторое редактирование строк и при этом выполнить сканирование ввода.

Идея функции getch заключается в том, чтобы вы могли получить обратный вызов после каждого нажатия клавиши. Код - это кросс-платформа между unix и windows. Чтобы использовать его, просто импортируйте getch из getch.

С ограниченной поддержкой только на забой, вы можете написать что-то вроде этого:

from getch import getch 
import sys 

def is_bad(text): 
    no=["badwords","morebadwords"] 
    words = text.split() 
    for w in words: 
     if w in no: 
      return True 
    return False 

def main(): 
    print 'Enter something' 
    text = '' 
    sys.stdout.write('') 
    while True: 
     ch = getch() 
     if ord(ch) == 13: 
      sys.stdout.write('\n') 
      break 
     if ord(ch) == 127: 
      if text: 
       text = text[:-1] 
      # first one to delete, so we add spaces 
      sys.stdout.write('\r' + text + ' ') 
      sys.stdout.write('\r' + text) 
     else: 
      text += ch 
      sys.stdout.write(ch) 
     if is_bad(text): 
      print 'You are writing something bad...' 
    print 'text = %s' % text   



if __name__ == '__main__': 
    main() 

Код должен быть улучшен путем разделения на более четкие функции, и вы также должны обрабатывать после плохого ввода сообщения, но я надеюсь, что вы Получите эту идею.

Надеюсь, это поможет.

+0

Работает ли это с Python 3x? Я не использую 2x –

+0

Я жду ответа eran. –

+0

@Defalt, я работал с python 2.7, вы будете конвертировать. Прости. – eran

Смежные вопросы