Сокет-коммуникатор на питоне, сервер на С
Я пытался добавить графический интерфейс к коммуникатору на основе сокетов в Python3
import sys
import socket
import select
from tkinter import *
def chat_client():
# initialize GUI
window = Tk()
window.geometry("600x800")
window.title("Communicator")
w = Canvas(window, width=580, height=450, bg="ivory2")
w.place(x=5, y=300)
# whole conversation is stored here
conversation = Text(window, width=80, height=30, wrap=WORD)
conversation.place(x=10, y=310)
label_enter = Label(window, text="Enter message: ")
label_enter.place(x=5, y=20)
# the message from here is being taken to send / write on std out
message_entry = Entry(window, width=30)
message_entry.place(x=120, y=20)
msg = ""
def say():
x = message_entry.get()
sys.stdout.write(x)
conversation.insert(0.0, x + '\n')
msg = message_entry.get().encode()
message_entry.delete(0, 'end')
btn_send = Button(window, text="Send!", command=say).place(x=120, y=50)
#THIS SEEMS TO BE THE PROBLEM!!!
window.mainloop()
######################
host = 'localhost'
port = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
# connect to remote host
try:
s.connect((host, port))
except:
print('Unable to connect')
sys.exit()
print('Connected to remote host. You can start sending messages')
#sys.stdout.write('[Me] ')
sys.stdout.flush()
while 1:
socket_list = [sys.stdin, s]
# Get the list sockets which are readable
ready_to_read, ready_to_write, in_error = select.select(socket_list, [], [], 1)
for sock in ready_to_read:
if sock == s:
# incoming message from remote server, s
data = sock.recv(4096)
if not data:
print('\nDisconnected from chat server')
sys.exit()
else:
# print data
sys.stdout.write(str(data))
#conversation.insert(0.0, str(data) + '\n')
sys.stdout.write('\n-> ');
sys.stdout.flush()
else:
# user entered a message
#msg = message_entry.get().encode() #sys.stdin.readline().encode()
s.send(msg.encode())
msg2 = sys.stdin.readline().encode()
s.send(msg2)
sys.stdout.write('\n-> ');
sys.stdout.flush()
message_entry.delete(0, 'end')
if __name__ == "__main__":
sys.exit(chat_client())
Я использую этот сервер (который работает нормально). Проблема в функции Tkinter mainloop() (строка 39), я думаю. Я перемещал это во много различных мест, ничто, кажется, не работает. Без окна Tkinter все работало нормально, кстати, когда я открываю 2 экземпляра этого коммуникатора без tkinter, сообщения отправляются и принимаются, а tkinter - нет. Пожалуйста, помогите, у меня заканчиваются идеи. PS извините за мой плохой английский, это не мой родной язык (как и Python в этом отношении).