вывод stdout "сбой" - PullRequest
       28

вывод stdout "сбой"

0 голосов
/ 25 сентября 2019

Я недавно изучил основы Python.Я пытаюсь создать чат-комнату на основе CLI, используя библиотеку сокетов в Python.

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

Проблема

Небольшой фрагмент обеих функций:

def send(conn):
 **msg = input()**
 # ....

def recv(conn):
 msg = str(conn.recv(1024), 'utf-8')

 **print(msg)**

Дело в том, что если кто-то отправляет вам сообщение, пока вы печатаете, полученное сообщениепросто печатается и добавляется к любому сообщению, которое вы печатали.

Я попробовал несколько хакерских способов, таких как использование списка (который объявлен глобально) для ввода.Используя getch () (из msvcrt), я добавляю ввод в этот список, когда он набирается.

msg_arr = []

# ...

def send(conn):
 letter = getch()

 while letter != '\r':
  msg_arr.append(letter)

Что меня заинтересовало, так это то, что теперь у меня была информация о длине текста в реальном времениэто было напечатано на экране.Таким образом, я могу использовать его в функции recv, чтобы сначала стереть столько символов с экрана, а затем распечатать сообщение.

def recv(conn):
 msg = str(conn.recv(1024), 'utf-8')

 print('\b' * len(msg_arr), end='')
 print(msg, end='')
 if len(msg) < len(msg_arr):
  print(' ' * (len(msg_arr) - len(msg)), end='')

 print('\n' + msg_arr)

Но код не работает.Может кто-нибудь предложить альтернативу?

...