将函数变量传递给标签

时间:2017-02-19 16:57:12

标签: python user-interface kivy

我正在与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;来自循环的变量。我希望标签在循环期间变量变化时更改文本。

请指教!

2 个答案:

答案 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分钟才能通过元素并将其添加到数据库中),当功能完成时,会显示文本。我想在一开始就显示这个文本。