从外部函数将项目写入tkinter列表框

时间:2019-04-25 13:28:58

标签: python multithreading sockets tkinter

我运行着一个小型的聊天服务器,人们可以在其中相互聊天。我想使用tkinter列表框监视传入的连接。

这是启动服务器脚本后的GUI。

enter image description here

用户连接到服务器后,我的列表框中将显示诸如“ XXX.XX.XXX.XXX:XXXXX”的消息:

enter image description here

我不知道为什么列表框在这一点上重复。

附加代码:

def accept_incoming_connections():
"""Sets up handling for incoming clients."""
    while True:
       client, client_address = SERVER.accept()
       s = str("%s:%s has connected." % client_address)
       client.send(bytes("Greetings from the cave!" + "Now type your name and press enter!", "utf8"))
       addresses[client] = client_address
       print(s)
       App().insert_log(s)
       Thread(target=handle_client, args=(client,)).start()


class App(tkinter.Tk):
   def __init__(self, *args, **kwargs):
       tkinter.Tk.__init__(self, *args, **kwargs)
       self.label = tkinter.Label(self, text="", width=20, anchor="w")
       self.label.pack(side="top", fill="both", expand=True)
       self.title('Chat - Server')
       self.geometry('400x400')
       self.messages_frame = tkinter.Frame()
       self.messages_frame.pack()
       self.msg_list = tkinter.Listbox(self.messages_frame, height=15, width=50)
       self.msg_list.insert(tkinter.END, 'Server ONLINE!')
       self.msg_list.insert(tkinter.END, 'AP: ' + str(ap))
       self.msg_list.insert(tkinter.END, 'IP: ' + str(ip))
       self.msg_list.insert(tkinter.END, 'Port: ' + str(PORT))
       self.msg_list.insert(tkinter.END, 'Waiting for connections..')
       self.msg_list.pack()

    def insert_log(self, logtext):
       self.msg_list.insert(tkinter.END, logtext)


def create_gui():
   app = App()
   app.mainloop()


def main():
   SERVER.listen(5)  # Listens for 5 connections at max.
   ACCEPT_THREAD = Thread(target=accept_incoming_connections)
   ACCEPT_THREAD.start()  # Starts the infinite loop
   GUI = Thread(target=create_gui)
   GUI.start()  # Starts the gui
   print('Server running. Waiting for clients...')
   ACCEPT_THREAD.join()
   SERVER.close()


if __name__ == "__main__":
   main()

该列表框项是在def accept_incoming_connections()上创建的:-> App()。insert_log(s)

重复来自哪里?

0 个答案:

没有答案
相关问题