Python: распечатать сообщение, запрашивая у пользователя ввод

Мне было интересно, может ли кто-нибудь помочь мне. Итак, я делаю чат на питоне с сокетами и использую потоки, чтобы клиент мог одновременно слушать и отправлять сообщения.

Но у меня проблема: когда клиент получает сообщение, он искажает ввод (он печатает полученное сообщение как ввод пользователя).

Поэтому мне было интересно, не было ли способов отменить ввод при получении сообщения, распечатать полученное сообщение, а затем снова запросить ввод

Или можно что-то сделать с нитями?

Если вам нужно, вот мой код потока:

recieve_thread = threading.Thread(target=recieve)
recieve_thread.start()
write_thread = threading.Thread(target=write)
write_thread.start()

А вот бит кода ввода и вывода сообщения

message = input("Me: ")
message = formatMess(nickname, message)
client.send(message.encode('ascii'))
message = client.recv(1024).decode('ascii')
print(message)

Спасибо

Вам нужно создать две программы сокетов: одну для клиентского сокета, а другую для сокета сервера. Сначала вам нужно подключить всех своих клиентов к серверу, а затем начать связь между клиентом и клиентом через сервер.

Manvi 20.02.2023 10:13

Уже сделал это

Beni 20.02.2023 11:07

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

Beni 20.02.2023 11:14

Моя проблема действительно связана с вводом и печатью, когда сообщение получено, я должен его распечатать, в то же время позволяя пользователю писать

Beni 20.02.2023 11:15

Не могли бы вы просто поделиться кодом, чтобы мы могли лучше понять вашу проблему?

Manvi 20.02.2023 12:03

Конечно мой плохой, обновляю его

Beni 20.02.2023 15:33

В идеале иметь отдельное окно для ввода и вывода, как во всех приложениях, подобных мессенджерам с графическим интерфейсом.

Mark Tolonen 20.02.2023 16:58
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
7
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на этом ответе stackoverflow , вы можете использовать следующее для печати сообщений над строкой ввода.

import threading


LOCK = threading.Lock()  # lock to avoid mixing messages while printing


def print_message(message):
    """ print the received message line by line above the input line"""
    with LOCK:
        for line in str.splitlines(message):
            print(
                "\u001B[s"             # Save current cursor position
                "\u001B[A"             # Move cursor up one line
                "\u001B[999D"          # Move cursor to beginning of line
                "\u001B[S"             # Scroll up/pan window down 1 line
                "\u001B[L",            # Insert new line
                 end = "")     
            print(line, end = "")        # Print message line
            print("\u001B[u", end = "")  # Move back to the former cursor position
        print("", end = "", flush=True)  # Flush message

В качестве иллюстрации, вот прием поддельного сообщения:

import threading
import time


def receive():
    i = 0
    while True:
        time.sleep(2)
        message = "hello \n\t" + str(i)
        i +=1 
        print_message(message=message)
            
            
def write():
    while True:
        x = input('>')


receive_thread = threading.Thread(target=receive)
receive_thread.start()
write_thread = threading.Thread(target=write)
write_thread.start()

Большое спасибо, мне было интересно, а нет ли более аккуратных способов сделать это? может быть, с очередями и потоками idk?

Beni 20.02.2023 15:37

Пожалуйста. К сожалению, я не вижу другого способа сделать это.

Remi Cuingnet 20.02.2023 17:05

@Beni Я рефакторил код. Я надеюсь, что это яснее.

Remi Cuingnet 21.02.2023 09:33

Да, спасибо большое, очень помогло, еще раз воспользуюсь

Beni 21.02.2023 13:38

Другие вопросы по теме