我使用这个论坛有一段时间了,但第一次提问。 我在使用一个 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/