将控制台输入线保持在输出下方

2023-12-08

[编辑:] 我目前正在尝试制作一个小型 tcp 聊天应用程序。发送和接收消息已经可以正常工作......但问题是:

当我在收到消息时开始输入消息时...它出现在我正在编写的文本之后

截屏:http://s7.directupload.net/images/140816/6svxo5ui.png

[用户发送>“你好”,然后我开始写“我正在写...”然后用户在发送消息之前写“我发送了...”...所以它被放置在我的输入之后... 我希望传入的消息始终位于我的输入之前!

这是我当前的代码: 客户端.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())

连接.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")

您的代码将所有内容写入标准输出。每当有东西到达发送者/接收者线程中的任何一个时,它都会打印到标准输出。问题是,由于输出流的基本性质,您cannot完成以下任务:

  • 放置收到的消息above当前正在输入/回显的内容。

事情严格按照发生的顺序发生。一旦有东西进来,无论光标在哪里,打印语句都会将该数据转储到那里。如果不使用更奇特/更强大的构造,您就无法修改该行为。

为了做你想做的事,我会使用ncurses。您似乎在 Windows 上使用 python,因此您必须深入研究如何获得等效功能。查看此线程:Windows 的 Curses 替代方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将控制台输入线保持在输出下方 的相关文章

随机推荐