kivy-需要等到线程完成

时间:2017-04-27 11:20:13

标签: multithreading kivy

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

我的应用:

Selenium Server Sstandalone: 2.53.1
Java Client for Appium 4.1.2
Appium Version: 1.4.13.1

列表必须" msg"如果我删除了行" self.add_widget(Label(text = alist [0]))"那么在recv系列中没问题。我只需要等到线程结束。

1 个答案:

答案 0 :(得分: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 = False,并指示正在处理数据的内容,并在回调中关闭它。