Ввод графического интерфейса с помощью select.select и sys.stdin в Python3 Chat

Я пытаюсь интегрировать этот модуль в Tkinter с помощью функции Entry () Tkinter. Однако после его интеграции терминал ожидает ввода. Без ввода с терминала чат не продолжится в окне ввода графического интерфейса Tkinter.

Я считаю, что это вызвано «sys.stdin» в «sockets_list = [sys.stdin, socket]». Я не знаю, чем заменить sys.stdin на GUI. Помогите, пожалуйста, спасибо!

def get_chat_entry(player, packet, lobby_id, connectPacket, event=None):
    # maintains a list of possible input streams 
    sockets_list = [sys.stdin, socket] 
    #Instantiate chat packet 
    chatPacket = packet.ChatPacket()
    read_sockets,write_socket,error_socket = select.select([socket],[],[])

    for socks in read_sockets: 
        if socks == socket: 
            packet_received = bytearray(socket.recv(2048))
            packet.ParseFromString(packet_received)
            packet_type = packet.type 

            #Chat packet type
            if packet_type == 3:
                #Receive broadcasted data from server
                chatPacket.ParseFromString(packet_received)
                print(chatPacket.message) 
                #update chat_text_box
                chat_history_Txt.config(state=NORMAL)
                chat_history_Txt.insert(END, chatPacket.message + '\n')
                chat_history_Txt.see("end")
                chat_history_Txt.config(state=DISABLED)
        else: 
            # #Write your message here
            chatPacket.type = TcpPacket.CHAT
            chatPacket.message = chat_entry.get()

            socket.send(chatPacket.SerializeToString())

Думали ли вы о чтении учебника по программированию графического интерфейса, управляемого событиями? «Я не знаю, чем заменить sys.stdin на GUI» - хороший показатель того, что программирование культа карго не работает.

TigerhawkT3 06.12.2018 04:51

Почему вы включили sys.stdin в sockets_list? Единственные входные данные должны быть либо от sockets (другие участники), либо от вашего ввода через chat_entry. Итак, удалите sys.stdin из sockets_list.

acw1668 06.12.2018 08:20

да спасибо. Я знаю, что его следует удалить и заменить на chat_entry, однако sockets_list принимает только ввод-вывод файлов. Chat_entry не является файлом ввода / вывода

user8961019 06.12.2018 08:27

Я не имею в виду, что вам нужно добавлять chat_entry в sockets_list. Вам нужно либо создать новый поток, либо использовать after() в основном потоке, чтобы дождаться ввода из сокета и обновить chat_history_Txt. Вам также необходимо подключить функцию bind к chat_entry, чтобы всякий раз, когда вы вводили сообщение и нажимали клавишу Enter, функция привязки выполнялась для обновления chat_history_Txt.

acw1668 06.12.2018 09:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
87
0

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