python - 在套接字上接收到一些输入后创建顶级

标签 python sockets tkinter

我使用这个论坛有一段时间了,但第一次提问。 我在使用一个 tkinter 应用程序时遇到问题。这是一个简单的聊天服务器-客户端程序,其中的聊天功能类似于 Skype。我有一个 friend 列表,当我从列表中选择 friend 时,单击聊天,将打开新窗口(顶层)。然后我就可以给 friend 发消息了。 问题出在另一边。如果聊天窗口在另一侧打开,它工作正常,但如果不是,我尝试通过调用创建新顶层的函数来创建。这里程序卡住了(在 friend 这边)。

def bChatPress(self, event=None):
        def closeChatClient():
            chatClient.destroy()
            del self.chatClients[friend]

        if self.friend=='':
            index = self.lbFriends.curselection()
            if index:
                friend = self.lbFriends.get(index)
                if friend not in self.chatClients:
                    chatClient=ChatClient(self, self.user, friend)
                    chatClient.protocol("WM_DELETE_WINDOW", closeChatClient)
                    self.chatClients[friend] = chatClient
        else:
            chatClient=ChatClient(self, self.user, self.friend)
            chatClient.protocol("WM_DELETE_WINDOW", closeChatClient)
            self.chatClients[self.friend] = chatClient
            self.friend=''

def receiveMessage(self):
        def loop():
            print('threadstart')
            while self.loged:
                try:
                    message = self.socket.recv(1024).decode('ascii')
                    print(message)
                    if '{LOGIN}' in message:
                        threading.Thread(target=self.login).start()
                    elif '{LOGOUT}' in message:
                        pass
                    elif '{CONNECT}' in message:
                        self.connect(message.replace('{CONNECT}',''))
                    elif '{DISCONNECT}' in message:
                        self.disconnect()
                    elif '{ADD FRIEND}' in message:
                        self.populateFriendsList(message.replace('{ADD FRIEND}',''))
                    elif '{DELETE FRIEND}' in message:
                        self.populateFriendsList(message.replace('{DELETE FRIEND}',''))
                    elif '{USER CONNECT}' in message:
                        self.checkOnline()
                    elif '{USER DISCONNECT}' in message:
                        self.checkOnline()
                    elif '{CHECK ONLINE}' in message:
                        self.populateFriendsList(message.replace('{CHECK ONLINE}',''))
                    elif '{MESSAGE}' in message:
                        self.processMessage(message.replace('{MESSAGE}',''))
                except Exception as error:
                    pass

        threading.Thread(target=loop).start()

这是创建聊天窗口的功能。当我通过单击按钮创建窗口时它工作正常,但是当我从 receiveMessage 函数调用此函数时它不起作用(这是监听套接字的循环)

以前有人遇到过这个问题吗? 提前致谢。

最佳答案

除了创建根窗口的线程之外,您不能从任何线程调用 tkinter 函数或小部件方法。

关于python - 在套接字上接收到一些输入后创建顶级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20972391/

相关文章:

c - 如何编写重发数据包的代理程序?

python - 方法后 Tkinter 的内部工作

python - 无法在 Tkinter 中使用 "index"获得标记

python - 编写 if 语句以避免某些列表项的更好方法是什么?

python - Tensorflow Slim : TypeError: Expected int32, 得到了包含 '_Message' 类型张量的列表

python ( Pandas ): store a data frame in hdf5 with a multi index

java - 使用 Java 检查数据库服务器状态

python - pip 未使用 pip.conf 中定义的额外索引 url

javascript - 如何让用户通过在 url 中输入房间名称来进入特定房间?套接字.io

python-3.x - 需要没有复选标记且平坦边框的复选按钮