为什么当另一个函数是 运行 时 Kivy 标签不更新?

Why do Kivy labels not update when another function is running?

我在下面有一些测试代码,基本上是在第二页上进行用户输入,其中计数器作为标签、文本输入和转到按钮上升。我的代码只是打印出输入的数字与当前计数之间的差异,只要输入的数字小于标签数字即可。否则它只会打印“完成”。但是当我 运行 代码 Kivy 暂停并且标签不更新时,但它打印得很好。我需要开始自学 python 线程还是我缺少什么?如果可以的话,我希望该标签能够作为其他功能 运行s.

不断更新

这是读取水箱水位的较大代码的一个非常小的版本(超出我的学习目的没有用)。在该代码中,我有一个声纳功能不断地 运行ning,就像我在这里做的一样,在主应用程序的构建方法中有一个时钟间隔计划。我将标签与声纳方法 returns 绑定到该级别,但我希望能够通过用户输入访问该级别并在该级别执行操作,而不仅仅是在每次按下其他方法的按钮时暂停界面.

.py

class Home(Screen):
    global i
    i=1
    def count_up(self):
        global i
        global count
        if i < 100:
            count = (0 + i)
            i += 1
        else:
            i = 1
            count = 0
        App.get_running_app().count=str(count)
        return count

    def finish(self):
        print("Done")

    def go(self, num):
        end_num = int(num.text)
        if end_num < self.count_up():  # add or if valve state equals close here to kill the program
            print(str(self.count_up() - end_num))
            time.sleep(0.5)  # Getting rid of this and using true sonar may fix the problem
            self.go(num)
        else:
            self.finish()

class Second(Screen):
    pass
class WindowManager(ScreenManager):
    pass

class HelpMe(App):
    count = StringProperty("")

    def build(self):
        kv = Builder.load_file("help2.kv")
        self.Home=Home()
        Main = kv.get_screen("Home")
        Clock.schedule_interval(lambda dt: Main.count_up(), 0.1)
        return kv

if __name__ == "__main__":
    HelpMe().run()

.kv

WindowManager:
    Home:
    Second:

<Home>:
    name:"Home"

    GridLayout:
        cols:1

        Button:
            text:"Go"
            on_release:
                app.root.current="Second"
                root.manager.transition.direction="left"

<Second>:
    name:"Second"
    num: num

    GridLayout:
        cols:1

        Label:
            text:app.count

        TextInput:
            id:num
            input_filter:"int"
            multiline:False

        Button:
            text:"Back"
            on_release:
                app.Home.go(num)
                num.text=""
                app.root.current="Home"
                root.manager.transition.direction="right"

如果您使用 time.sleep,您的 GUI 将暂停。您必须使用计划功能来保留应用 运行。 您可以更改:

time.sleep(0.5)
self.go(num)

收件人:

Clock.schedule_once(lambda dt: self.go(num), 0.5)

此外,每次使用 num 调用函数 go 时,您都在引用输入表单。所以如果你用 num.text: "" 擦除它,你会收到一个错误。要绕过这个,要么从 kv 语言中删除这个语句,要么像这样调用你的函数:

on_release:
    app.Home.go(num.text)
    num.text=""

并且在您的 go 函数中:

end_num = int(num)