Почему socket.accept () не показывает графический интерфейс Tkinter? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь превратить пакет клиент-сервер в одно приложение. Поэтому, когда приложение открыто, сервер автоматически переходит в режим ожидания / прослушивания. Проблема заключается в том, что при запуске серверного сокета графический интерфейс не отображается до тех пор, пока socket.accept(). Я хотел бы, чтобы графический интерфейс и сокет сервера происходили одновременно.

Я закомментировал строки кода, и он работает как задумано до точки conn,addr=s.accept()

imports*

root= Tk()

#main config
#mouse drag
# ------------------ Server Socket ------------------
connectionStatus = Label(rootCanvasBG)
connectionStatus.grid(column=0, row=7)

s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host, port))
s.listen(10)
print(host)
print('waiting for connection')
connectionStatus.config(text='Waiting for any incoming connections')
conn, addr = s.accept()  # thread issue, not showing tkinter
connectionStatus.config(text=addr)
print(addr, 'connected')

#Layout

root.mainloop()

Я читал о потоке, чтобы решить эту проблему, но ни один из примеров, которые я видел, не дал достаточно четких ответов. Я все еще довольно плохо знаком с питоном и программированием в целом. Спасибо

1 Ответ

0 голосов
/ 02 июня 2019
import threading   # <<< Import Threading

# ------------------ Server Socket ------------------

connectionStatus = Label(rootCanvasBG)
connectionStatus.grid(column=0, row=7)

s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host, port))
s.listen(10)
print(host)
print('waiting for connection')
connectionStatus.config(text='Waiting for any incoming connections')
def mainloop():   # <<< create a def
    while True:
        conn, addr = s.accept()  # thread issue, not showing tkinter
        connectionStatus.config(text=addr)
        print(addr, 'connected')
threading.Thread(target=mainloop).start() # <<< run loop on new thread

Найдя решение, начните с импорта threading, создайте def mainloop() с while loop для conn, addr = s.accept(), используйте threading.Thread() для назначения mainloop и .start() для выполнения потоков.

...