Я работаю над графическим чатом, созданным с помощью python и модулей: threading, sockets и tkinter.Это работает очень просто, принимая клиентские соединения в потоке 'accept connection' и запуская потоки, которые получают сообщения в 'startreceivethread' и распространяют свои сообщения другим клиентам, используя функцию потока 'addmessage' (где tkinter выдает ошибку).импорт сокетов импорт потоков обработка время импорта import tkinter
ip = "127.0.0.1"
port=1234
serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serversocket.bind((ip,port))
serversocket.listen()
username = "User"
username = username+": "
print("Your ip is "+ip+".")
clients = []
messages = ["Welcome to the chat!","","","",""]
print("Waiting for client...")
screen = tkinter.Tk()
screen.title("Server Chat")
entry = tkinter.Entry(screen)
entry.grid(column=0,row=5)
def addmessage(mesg):
i = 0
notend = True
for label in labels:
if notend:
label.configure(text=messages[i])
i += 1
text0 = tkinter.Label(screen,text="")
text0.grid(column = 0,row = 4)
text1 = tkinter.Label(screen,text="")
text1.grid(column = 0,row = 3)
text2 = tkinter.Label(screen,text="")
text2.grid(column = 0,row = 2)
text3 = tkinter.Label(screen,text="")
text3.grid(column = 0,row = 1)
text4 = tkinter.Label(screen,text="")
text4.grid(column = 0,row = 0)
labels = [text0,text1,text2,text3,text4]
def startreceivethread(client):
def receive():
while True:
message = client.recv(1024).decode("utf-8")
if message == "r":
print("hey!")
else:
global messages
messages.insert(0,message)
addmessage(message)
Thread = threading.Thread(target=receive)
Thread.start()
def send():
global messages
message = entry.get()
entry.delete(0,len(message))
message = username+message
messages.insert(0,message)
addmessage(message)
for client in clients:
client.send(message.encode("utf-8"))
button = tkinter.Button(screen, text = "Send", command = send)
button.grid(column=1,row=5)
def acceptconnection():
while True:
(clientsocketr, address) = serversocket.accept()
clients.append(clientsocketr)
print("Client connected!")
startreceivethread(clientsocketr)
accept = threading.Thread(target=acceptconnection)
accept.start()
entry.bind("<Return>",func = lambda event: send())
Однако, когда я начал использовать потоки в чате, чтобы разрешить подключение нескольких клиентов, tkinter выдал ошибку.
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python37\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Python37\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "Z:\Programming Stuff\Dorm Communication Project\Lennon Chat\Lennon
Chat 2.3 (Host).py", line 61, in receive
addmessage(message)
File "Z:\Programming Stuff\Dorm Communication Project\Lennon Chat\Lennon
Chat 2.3 (Host).py", line 37, in addmessage
label.configure(text=messages[i])
File "C:\Python37\lib\tkinter\__init__.py", line 1482, in configure
return self._configure('configure', cnf, kw)
File "C:\Python37\lib\tkinter\__init__.py", line 1473, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
RuntimeError: main thread is not in main loop
Другими словами, использование tkinter внутри потока не работает, и мне нужна альтернатива, чтобы он работал.
Я думаю, что вы можете связать функции со списком событий (в основном вызывая функциюкогда список меняется).
Использование другого графического модуля, который вы можете просто добавить в директорию моего скрипта.
Другой способ создания потоков.
Я всего лишь маленький ребенок, и, возможно, я не знаю, о чем вы говорите в своем ответе, поэтому, пожалуйста, попробуйте объяснить, какой из словарного запаса или языка вы используете..
Если я допустил какие-либо ошибки или мой вопрос не ясен, скажите мне, что я сделал что-то не так, и мне нужно это исправить ... Спасибо!