我正在与Kivy框架挣扎一段时间。我在网上找不到问题的答案。
我有两个文件:main.py和.kv文件。 在main.py文件中,我在Boxlayout中有函数。
例如:
class Box(BoxLayout):
def change(self):
variable = 0
while variable < 10:
text = "Some text " + str(variable)
variable += 1
正如您所看到的,有一个字符串变量&#34; text&#34;并且每个循环的变量都不同。
现在在.kv文件中我有一个标签。 例如:
Box:
BoxLayout:
Button:
id: butt
text: ""
on_press: root.change()
Label:
id: label_text
我想按钮运行函数change(),我希望看到&#34; text&#34;的值变量显示在标签中。 因此,在用户点击按钮后,他会在标签上看到文字更改: &#34;一些文字0&#34;,&#34;一些文字1&#34;,&#34;一些文字2&#34; ....&#34;一些文字9&#34;。
我尝试在main.py文件中使用标签ID,如:
(内部更改功能)
label = self.ids['label_text']
self.count = str(variable)
label.text = "Some text " + self.count
但最终没有任何结果。 我想我可以用&#34;返回文字&#34;在功能结束时,但我不想只通过最后一次&#34;文本&#34;来自循环的变量。我希望标签在循环期间变量变化时更改文本。
请指教!
答案 0 :(得分:0)
from kivy.properties import StringProperty
并将您的标签文本定义为label_text = StringProperty()
,以便在您的逻辑中更改时,它会在GUI中更新。
在.kv
文件中将text: root.label_text
添加到Label
媒体资源和.py
文件中:
class Box(BoxLayout):
label_text = StringProperty()
def change(self):
variable = 0
while variable < 10:
self.label_text = "Some text " + str(variable)
variable += 1
这是关于更新GUI中标签文本值的问题的答案。但是不要使用while True
之类的循环或你在代码中使用的循环,因为它会阻止kivy的GUI线程更新自身。而是使用kivy Clock(from kivy.clock import Clock
)来安排任务并以特定的间隔运行它,这样GUI线程就不会被阻止。像
class Box(BoxLayout):
label_text = StringProperty()
interval = 0.5 # Second
offset = 0
def change(self):
# You ask the clock to update the label's value every self.interval (0.5) second
self.event = Clock.schedule_interval(self.update_label_text, self.interval)
def update_label_text(self, dt):
if self.offset < 10:
self.label_text = "some_text" + str(self.offset)
self.offset += 1
else:
# Finally ask the clock to forget about updating
Clock.unschedule(self.event)
答案 1 :(得分:0)
在标签中显示文字仍然存在一些问题。使用短函数,一切似乎都很好但我有这个函数有很多打开文件,ifs和写入数据库:
def add_to_base(self, dt):
self.adding = "Adding to database..."
with open("new_links.txt", "r", encoding='utf-8') as f:
for line in f:
working on html here
xxx = got list of string here
for x in xxx:
if ....
zzz = got another list with string
for i in xxx:
if
.
.
Lots of elif's
write element to database
print("Added to databes")
if element is last element:
Clock.unschedule(self.event)
当然这不是实际的代码,只是模拟它的工作原理。 我想显示和更新&#34; self.adding&#34;来自此功能的文字。 在.kv文件中,我有带文本的标签:self.adding属性。 在运行此add_to_base函数时使用:
def update_base(self):
self.event = Clock.schedule_interval(self.add_to_base, self.interval)
问题是,该文本显示在标签上但在此功能的最后。此功能需要很长时间才能完成(大约需要15分钟才能通过元素并将其添加到数据库中),当功能完成时,会显示文本。我想在一开始就显示这个文本。