在Python中使用PodSixNet库时,我在使用Tkinter时遇到了问题

在Python中使用PodSixNet库时,我在使用Tkinter时遇到了问题,python,multithreading,sockets,tkinter,Python,Multithreading,Sockets,Tkinter,所以我使用的是服务器-客户端交互。它工作得很好,但是当我尝试添加Tkinter时,我在assyncore中获得了最大的递归深度 这是我的客户机,服务器工作正常: import sys from time import sleep from sys import stdin, exit from Tkinter import * import Tkinter from PodSixNet.Connection import connection, ConnectionListener # Th

所以我使用的是服务器-客户端交互。它工作得很好,但是当我尝试添加Tkinter时,我在assyncore中获得了最大的递归深度

这是我的客户机,服务器工作正常:

import sys
from time import sleep
from sys import stdin, exit
from Tkinter import *
import Tkinter

from PodSixNet.Connection import connection, ConnectionListener

# This example uses Python threads to manage async input from sys.stdin.
# This is so that I can receive input from the console whilst running the server.
# Don't ever do this - it's slow and ugly. (I'm doing it for simplicity's sake)
from thread import *
class App:
        def __init__(self, master, connection):
            self.connection = connection
            self.frame = Frame(master)
            self.frame.pack()
            self.connection.Send({"action":"nickname","nickname":"test"})
class Client(ConnectionListener):
    global players
    players = []
    def __init__(self, host, port):
        root = Tk()
        root.title("CHAT")
        app = App(root, connection)
        start_new_thread(root.mainloop, ())
        print "Enter your nickname:",
        nick = raw_input()
        self.Connect((host, port))
        connection.Send({"action": "nickname", "nickname": nick})
        # launch our threaded input loop
        t = start_new_thread(self.InputLoop, ())
    
    def Loop(self):
        connection.Pump()
        self.Pump()
    
    def InputLoop(self):
        global players
        
        # horrid threaded input loop
        # continually reads from stdin and sends whatever is typed to the server
        while 1:
            msg = raw_input()
            if msg.startswith("/"):
                cmd = msg[1:]
                if cmd.lower().startswith("pm"):
                    to = cmd[3:].split(" ", 1)[0]
                    msg = cmd[3:].split(" ", 1)[1]
                    if to in players:
                        connection.Send({"action": "PM", "to": to, "message":msg})
                    else:
                        print "That person is not online!"
                        continue
                elif cmd.lower().startswith("name"):
                    newName = cmd[5:]
                    connection.Send({"action":"nickname","nickname":newName})
            else:
                connection.Send({"action": "message", "message": msg})
    
    #######################################
    ### Network event/message callbacks ###
    #######################################
    
    def Network_players(self, data):
        global players
        #Recieved list of players.
        players = data['players']
    
    def Network_message(self, data):
        #Got a message.
        print data['from'] + ": " + data['message']\
        
    def Network_serverMessage(self, data):
        msg = data['message']
        print "Server:",msg
    def Network_PMrecieve(self, data):
        msg = data['message']
        of = data['from']
        print "PM from " + of + ": " + msg
    def Network_PMsuccess(self, data):
        success = data['success']
        if success == True:
            print "PM successfully sent!"
        else:
            print "Error, recipient may not be online."
        
    # built in stuff
    def Network_connected(self, data):
        print "You are now connected to the server"
    
    def Network_error(self, data):
        print 'error:', data['error'][1]
        connection.Close()
    
    def Network_disconnected(self, data):
        print 'Server disconnected'
        exit()

c = Client("localhost", 12345)
while 1:
    c.Loop()
    sleep(0.001)
它只在我尝试使用connection.Send时给出错误,而不是从客户端类的任何位置发送


我听说Tkinter不是线程安全的?如果是这样,我如何修复它?

您不能从多个线程访问Tkinter小部件。您正在一个线程中创建根窗口,但在另一个线程中运行事件循环

那么我要把它全部穿到一根线上吗?我可以从另一个线程访问一个函数来向tkinter小部件添加一些东西吗?要从另一个线程向小部件添加一些东西,你必须将一些东西放在一个队列中,然后将它从主线程的队列中拉出。请看,我可以将其用于根,而不是对每种类型的小部件都这样做吗?