为什么当另一个函数是 运行 时 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)
我在下面有一些测试代码,基本上是在第二页上进行用户输入,其中计数器作为标签、文本输入和转到按钮上升。我的代码只是打印出输入的数字与当前计数之间的差异,只要输入的数字小于标签数字即可。否则它只会打印“完成”。但是当我 运行 代码 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)