2017-04-27 80 views
0

我在我的应用程序线程中添加了一些列表,然后我想在其他屏幕上打印它,但程序在打印后运行线程,它是给我的错误,我的列表中没有任何东西。我需要停止该程序,直到线程完成,我该怎么做?我试图用。加入(),但它是没有工作...感谢您的帮助kivy-需要等到线程完成

我的应用程序:

class LoginScreen(GridLayout): 
    def __init__(self, **kwargs): 
     super(LoginScreen, self).__init__(**kwargs) 
     self.cols = 2 


     self.add_widget(Label(text='username')) 
     self.username = TextInput(multiline=False) 
     self.add_widget(self.username) 

     self.add_widget(Label(text='Password')) 
     self.password = TextInput(multiline=False, password=True) 
     self.add_widget(self.password) 

     self.submit_button = Button(text='sumbit',size_hint=(.5, 
.25),font_size=20) 
     self.submit_button.bind(on_press=self.submit_username) 
     self.add_widget(self.submit_button) 

    def submit_username(self, *args): 

     self.msg=threading.Thread(target=send_data(self.username.text)) 
     self.msg.start() 
     self.msg.join() 
     sm.current = 'searchi' 
     sm.transition.direction = 'left' 

def send_data(name): 
    my_socket = socket.socket() 
    my_socket.connect(('127.0.0.1', 8093)) 
    my_socket.send(name.encode('utf-8')) 
    name,address = my_socket.recvfrom(1024) 
    msg = name.decode('utf-8') 
    alist.append(msg) 
    my_socket.close() 

# Declare both screens 

class Searchi(Screen): 
    def __init__(self, **kwargs): 
     super(Searchi, self).__init__(**kwargs) 
     self.add_widget(Label(text=alist[0])) 

列表中有“味精”如果我删除行“self.add_widget (Label(text = alist [0]))“,那么在recv行中没有问题。我只需要等到线程完成。

+0

我发布的答案有帮助吗? – Tshirtman

回答

0

为什么要打扰一个线程,如果你要等待呢?你可以调用send_data(self.username.text)并完成它。

但是这样做通常是不好的做法(阻塞没有线程的调用,或者以阻塞的方式等待线程完成),你想要什么,而不是等待任务完成之前完成应该对正在完成的任务做出反应,也就是说,在线程结束时,执行一些可以让您的应用程序继续进行的任务。

您可以通过回调将用户移动到线程末尾调用的新屏幕。

def submit_username(self, *args): 
    def callback(): 
     sm.current = 'searchi' 
     sm.transition.direction = 'left' 
    threading.Thread(target=send_data(self.username.text, callback).start() 

def send_data(name, callback): 
    my_socket = socket.socket() 
    my_socket.connect(('127.0.0.1', 8093)) 
    my_socket.send(name.encode('utf-8')) 
    name,address = my_socket.recvfrom(1024) 
    msg = name.decode('utf-8') 
    alist.append(msg) 
    my_socket.close() 
    callback() 

,如果你希望你的用户,而动作发生碰任何东西,我会建议把一个弹出与auto_dismiss =假,并表明数据的内容正在处理,并关闭它在回调。