Mantenga la línea de entrada de la consola por debajo de la salida

[EDIT:] Actualmente estoy tratando de hacer una pequeña aplicación de chat TCP. Enviar y recibir mensajes ya funciona bien … Pero el problema es:

Cuando empiezo a escribir un mensaje mientras recibo uno … aparece después del texto que estoy escribiendo

Captura de pantalla: http://sofes.miximages.com/console/6svxo5ui.png

[Usuario enviado> “hola”, luego comencé a escribir “Estoy escribiendo …” y luego el usuario escribió “Envié un …” antes de enviar mi mensaje … por lo que se colocó después de mi entrada … ¡Quiero que el mensaje entrante esté siempre antes de mi entrada!

Este es mi código actual: Client.py

con = connect.User() server = raw_input("Type in the server adress \n[leave blank to use xyr.no-ip.info]\n>:") nick ="" while nick == "": nick = raw_input("Type in your nickname\n>:") con.connect(server, nick) def sender(): print("Sender started") while 1: msg = raw_input() if msg == "q": break con.send(msg) con.disconnect() def receiver(server): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if server == "": server="xyr.no-ip.info" sock.connect((server, 8000)) sock.send("%pyreceiver\n") print("Receiver started") while 1: msg_in = sock.recv(1024) if not str(msg_in).startswith("[py]" + nick): if str(msg_in).startswith("/ua"): print(str(msg_in)[3:]) elif str(msg_in).startswith("/u "): print(str(msg_in)[2:]) else: print(str(msg_in[:-1])) # if nick == "": nick = "guest" print("Name changed to ""guest""") time.sleep(.5) thread.start_new_thread(receiver, (server, )) time.sleep(.5) thread.start_new_thread(sender()) 

Connect.py

 import socket import time class User(): nickel ="" def connect(self, server="xyr.no-ip.info", nick="guest"): nickel = nick self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if server == "": server="xyr.no-ip.info" print("server changed to xyr.no-ip.info") time.sleep(.5) print("Connecting...") self.sock.connect((server, 8000)) print("Connected") time.sleep(.4) self.sock.send("[py]" + nick + "\n") self.sock.send(nick + " connected with a python client\n") print("registered as " + nick) time.sleep(.3) def send(self, msg): self.sock.send(msg + "\n") def disconnect(self): self.sock.close() print("disconnected") 

Tu código lo escribe todo en stdout. Cada vez que llega algo a cualquiera de los hilos del remitente / receptor, se imprime en la salida estándar. El problema con eso es que, debido a la naturaleza fundamental de los flujos de salida, no puede lograr lo siguiente:

  • coloque los mensajes entrantes sobre las cosas que se están escribiendo / repitiendo actualmente.

Las cosas suceden estrictamente en el orden de ocurrencia. En el momento en que entra algo, dondequiera que esté el cursor, la instrucción de impresión vuelca esos datos allí. No puede modificar ese comportamiento sin usar construcciones más potentes / más sofisticadas.

Para hacer lo que quieras, usaría ncurses . Parece que estás usando python en Windows, así que tendrás que investigar un poco cómo obtener una funcionalidad equivalente. Echa un vistazo a este hilo: Curses alternativa para windows

Tuve un problema similar y descubrí que una solución más simple (para mí) era obtener información a través de readchar ( https://github.com/magmax/python-readchar/tree/master/readchar ).

Usando readchar, me gustaría amortiguar cada pulsación de tecla (verificando key.BACKSPACE y CR – vea el fragmento de código a continuación).

Todas las salidas, antes de “+ 033 [1A” (hacer que el cursor se mueva hacia arriba), imprimirán la línea de salida y luego “/ n” …

después de cada línea de salida, muevo el cursor al principio y self.input_buff el self.input_buff

mientras el usuario está haciendo una entrada, esto maneja la entrada de la consola, mostrando lo que están escribiendo:

  keypress = readkey() if keypress == key.BACKSPACE: self.input_buff = self.input_buff[:-1] print("\033[0A%s " % self.input_buff) continue if keypress != key.CR: self.input_buff = "%s%s" % (self.input_buff, keypress) print("\033[0A%s" % self.input_buff) continue 

Esto mantuvo la línea de entrada en la parte inferior y toda la salida del terminal por encima de ella.

Sé que llega un año tarde y si eres un fanático de las maldiciones, tal vez ese sea el camino a seguir …