gpt4 book ai didi

python - Kivy:标签文本在 for 循环期间不更新

转载 作者:太空狗 更新时间:2023-10-30 01:12:28 26 4
gpt4 key购买 nike

当我尝试在 for 循环期间更新标签文本时遇到问题。有类似的条目(例如:Update properties of a kivy widget while running code),但它们似乎并不完全符合我的问题(或者我错过了重点……)。我运行以下代码:

*.py:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
#from time import sleep

class MyBox(BoxLayout):
tobeupd = StringProperty()

def __init__(self,*args,**kwargs):
super(MyBox,self).__init__(*args,**kwargs)
self.tobeupd = '#'

def upd_ltxt(self):
for i in range(1,10):
self.tobeupd = str(i)
print(self.tobeupd)
input('Write something: ') # new line, see edit below
#sleep(0.5)

class updApp(App):
def build(self):
return MyBox()

if __name__ == '__main__':
updApp().run()

*.kv

<MyBox>:
orientation: 'horizontal'
cols: 2
Label:
text: root.tobeupd
Button:
text: 'Start Update'
on_release: root.upd_ltxt()

虽然“print”语句定期更新 shell,但标签文本仅在 for 循环结束时更新。任何人都可以向我解释为什么 Kivy 以这种方式工作以及我如何克服这个问题?

编辑:根据 PM2Ring 和 Gugas 的说法,我更改了代码以避免 sleep 功能。如果我要求用户在继续循环之前输入一些内容,问题仍然存在。这些值在 shell 中更新,但不在标签上更新。

最佳答案

您可以为此使用线程
当你在 kivy 中执行循环或等待输入时,主线程正在等待,应用程序上不会更新任何内容。 threading 会阻止这种情况。
使用threading 在主线程之外创建另一个线程。
示例:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.lang import Builder
import threading

Builder.load_string('''

<MyBox>:
orientation: 'horizontal'
cols: 2
Label:
text: root.tobeupd
Button:
text: 'Start Update'
on_release: root.upd_ltxt()

''')

class MyBox(BoxLayout):
tobeupd = StringProperty()

def __init__(self,*args,**kwargs):
super(MyBox,self).__init__(*args,**kwargs)
self.tobeupd = '#'

def upd_ltxt(self):
threading.Thread(target=self.update_label).start()

def update_label(self):
for i in range(1,10):
print(self.tobeupd)
self.tobeupd = str(i)
input('Write something: ') # new line, see edit below



class updApp(App):
def build(self):
return MyBox()

if __name__ == '__main__':
updApp().run()

现在值得一提的是,您可以继续按下按钮并启动线程,即使第一个线程尚未完成。这可能是不受欢迎的行为。
这可以通过在线程开始时禁用按钮并在结束时再次启用来防止。

以kv为单位给按钮一个id:

Button:
id: updatebutton
text: 'Start Update'
on_release: root.upd_ltxt()

然后在线程中这样做:

def update_label(self):

self.ids.updatebutton.disabled = True

for i in range(1,10):
self.tobeupd = str(i)
input('Write something: ')

self.ids.updatebutton.disabled = False

关于python - Kivy:标签文本在 for 循环期间不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com