Python 尝试使用多线程接收套接字数据

Python 尝试使用多线程接收套接字数据,python,select,tkinter,Python,Select,Tkinter,编辑:在我的计划改变后(布莱恩说我不能使用TkInter的“选择”库) 我尝试使用多线程,但键入了一些似乎不起作用的内容: def receive_data(): try: (client_socket, address) = server_socket.accept() print client_socket.recv(1024) except socket.error: print 'error' def server_wi

编辑:在我的计划改变后(布莱恩说我不能使用TkInter的“选择”库) 我尝试使用多线程,但键入了一些似乎不起作用的内容:

def receive_data():
    try:
        (client_socket, address) = server_socket.accept()
        print client_socket.recv(1024)
    except socket.error:
        print 'error'


def server_window():
    window = Tk()
    data = ''
    activate_window(window, 666, 666)
    b1 = Button(window, text='RECEIVE DATA', fg='sienna', bg='khaki', command=lambda info=data: handle_waiter(info))
    b1.grid(sticky='W', row=2, column=0, columnspan=1)
    b1 = Button(window, text='ORDERS',  fg='sienna', bg='khaki', command=orders_window)
    b1.grid(sticky='W', row=1, column=0, columnspan=1)
    thread = threading.Thread(target=receive_data())
    thread.start()

    window.mainloop()

然而,我所做的似乎阻止了GUI。。。如果有人能帮助我,我将非常高兴。问题是线程的
目标是可调用的。
另一方面,传递给
线程的不是
接收数据
,而是
接收数据()

长话短说,当您到达
线程
构造函数的参数求值点时,
receive_data
函数将在当前线程上调用,并且您将一直呆在它里面直到它结束

只需删除括号,然后按如下方式创建线程:

thread = threading.Thread(target=receive_data)

问题是线程的
目标
是可调用的。
另一方面,传递给
线程的不是
接收数据
,而是
接收数据()

长话短说,当您到达
线程
构造函数的参数求值点时,
receive_data
函数将在当前线程上调用,并且您将一直呆在它里面直到它结束

只需删除括号,然后按如下方式创建线程:

thread = threading.Thread(target=receive_data)

一段时间后,我成功地使用了select,而没有阻塞我的TKinter代码

现在我配置了一些随机按钮(b5)来发送消息(应该是阻塞的)

而这些功能是:

def others_messages(read_list):
    for current_socket in read_list:
        try:
            data = current_socket.recv(1024)
            print data
        except:
            print "Connection with server closed."
            current_socket.close()


def send_waiting_messages(write_list, m_to_send):
    for message in m_to_send:
        (client_socket, data) = message
        if client_socket in write_list:
            print data
            client_socket.send(data)
            m_to_send.remove(message)

一段时间后,我成功地使用了select,而没有阻塞我的TKinter代码

现在我配置了一些随机按钮(b5)来发送消息(应该是阻塞的)

而这些功能是:

def others_messages(read_list):
    for current_socket in read_list:
        try:
            data = current_socket.recv(1024)
            print data
        except:
            print "Connection with server closed."
            current_socket.close()


def send_waiting_messages(write_list, m_to_send):
    for message in m_to_send:
        (client_socket, data) = message
        if client_socket in write_list:
            print data
            client_socket.send(data)
            m_to_send.remove(message)

tkinter是单螺纹的。如果你有一个阻塞的函数,你需要在另一个线程或进程中运行它。嗨,Bryan,你能告诉我怎么做吗?因为我不知道如何使用除select之外的任何东西,我会使用哪个库Kinter是单线程的。如果你有一个阻塞的函数,你需要在另一个线程或进程中运行它。嗨,Bryan,你能告诉我怎么做吗?因为我不知道如何使用除select之外的任何东西,我应该使用哪个库谢谢,但是现在我的线程被调用了一次,我能永远接收数据吗?我不想让它只运行一次,但现在我的线程被调用了一次,我能永远接收数据吗?我不想让它只工作一次