Python 尝试使用多线程接收套接字数据
编辑:在我的计划改变后(布莱恩说我不能使用TkInter的“选择”库) 我尝试使用多线程,但键入了一些似乎不起作用的内容: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
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之外的任何东西,我应该使用哪个库谢谢,但是现在我的线程被调用了一次,我能永远接收数据吗?我不想让它只运行一次,但现在我的线程被调用了一次,我能永远接收数据吗?我不想让它只工作一次