Обновление терминала при получении новых данных с сокет-сервера - PullRequest
3 голосов
/ 20 апреля 2019

Я пытаюсь сделать клиент веб-чата на python, используя терминал и ругательства. Тем не менее, я не могу обновить его при появлении новых данных в recv, мне нужно отправить сообщение, а затем он получает данные ...

Это код:

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())

Любые идеи, как я могу перерисовать экран, когда есть новые данные на recv?

Редактировать: завершить пример по запросу:

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")

...