Python - решения для потоков с помощью tkinter - PullRequest
0 голосов
/ 20 сентября 2019

Я работаю над графическим чатом, созданным с помощью 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 внутри потока не работает, и мне нужна альтернатива, чтобы он работал.

  • Я думаю, что вы можете связать функции со списком событий (в основном вызывая функциюкогда список меняется).

  • Использование другого графического модуля, который вы можете просто добавить в директорию моего скрипта.

  • Другой способ создания потоков.

Я всего лишь маленький ребенок, и, возможно, я не знаю, о чем вы говорите в своем ответе, поэтому, пожалуйста, попробуйте объяснить, какой из словарного запаса или языка вы используете..

Если я допустил какие-либо ошибки или мой вопрос не ясен, скажите мне, что я сделал что-то не так, и мне нужно это исправить ... Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...