从套接字接收新数据时更新终端

2024-04-27 03:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python上使用终端和curses创建一个web聊天客户端。然而,我不能使它刷新时,有新的数据接收,我需要发送一条消息,然后它得到的数据。。。你知道吗

代码如下:

chat_msg_list = list()
global_chat = curses.newwin(10, 50, 2, 23)
user_chat = curses.newwin(3, 45, 22, 32)

ready = select.select([s], [], [], 0)
if ready[0]:
      data = s.recv(1024)
      chat_msg_list.append(data.decode())
      for i in range(len(chat_msg_list)):
          global_chat.addstr(i, 1, chat_msg_list[ i ])
      global_chat.refresh()

但是,如果在按下CTRL+G之前没有发生:

    box = Textbox(user_chat)
    box.edit()
    message = box.gather()
    screen.nodelay(1)
    s.send(message.encode())

有什么想法吗?当接收器上有新数据时,我如何重新绘制屏幕?你知道吗

编辑:根据要求完成示例:

def main(screen):
    """Main client order call and loop"""

    user_chat = curses.newwin(3, 45, 22, 32)
    user_chat.scrollok(True)
    user_chat.idlok(True)

    screen.addstr(0, 3, "Users List:")

    # Rectangles:

    rectangle(screen, 1, 0, 23,20)      # user list rectangle
    rectangle(screen, 1, 21, 19, 78)    # chat rectangle
    rectangle(screen, 21, 21, 23, 78)   # user input rectangle

    # Get the user name on screen
    user_name = login()
    screen.addstr(22, 22, user_name)
    # Help:
    screen.addstr(20, 25, "Press CTRL + G to send [CTRL + C exits]")
    screen.refresh()

    # Add the user list:
    user_list_box = curses.newwin(15, 19, 2, 1)
    data = s.recv(1024)
    chat_msg_list.append(data.decode())

    for i in range(len(user_list)):
        user_list_box.addstr(i, 1, user_list [ i ])

    # Global chat window:
    global_chat = curses.newwin(10, 50, 2, 23)

    for i in range(len(chat_msg_list)):
        global_chat.addstr(i, 1, chat_msg_list[ i ])
    global_chat.refresh()

    # Input from user:

    box = Textbox(user_chat)
    box.edit()
    message = box.gather()
    send_message = message_string(message, login())  # login should not come here.
    s.send(send_message)        # send msg to srv

if __name__ == '__main__':
        s.connect((HOST, PORT))

        try:
            screen = curses.initscr()
            while True:
                curses.wrapper(main)
        except KeyboardInterrupt:
            s.close()           # I believe the srv crash is here?
            sys.exit("Program Finished")


Tags: nameboxsendmessagedatachatmsgscreen