Kivy:如何用'TextInput'中的文本更新'Label's文本?

时间:2019-07-23 11:52:21

标签: python kivy

我正在制作一个GUI,其中有一个生成Labels的函数,并且我想让用户也可以更改那些Label的文本。

但是这让我头疼不已,因此我尝试了较小的尝试,创建了一个标签,该标签显示了创建的标签数量,并且尝试使用不同的解决方案来更新“新数量标签文本”,但是没有运气。 / p>

我尝试线程化但是失败了。然后我在Kivy中尝试了Clock Object,但是我也失败了,因为那些不起作用,我没有失败,这是因为我是编程的新手,我并没有真正理解它们。 py:

class Screen_two(Screen):
    productsamount = StringProperty(None)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        Clock.schedule_once(self.update_amount_label, 0)

    def update_amount_label(self, dt):
        n = 0
        for i in db.databaseDict.items():
            n += 1
        self.ids.productsamount.text = 'Amount of goods: {}'.format(n)

kv:

<Screen_two>:
    productsamount: productsamount
    Label:
        font_size:'11dp'
        id:productsamount

编辑1: 我想使用def add_product(self):函数来更改“标签”文本。

class addbut_popup(FloatLayout):
    addprodname = ObjectProperty(None)
    addprodprice = ObjectProperty(None)

    def print_to_consol(self):
        print('Added.')

    def add_product(self):
        if self.addprodname.text != "" and '.' not in self.addprodname.text:
            if re.findall(r'\D', self.addprodprice.text) == []:
                db.add_product(self.addprodname.text, self.addprodprice.text)
                self.print_to_consol()
                self.reset()
            else:
                invalid()
                self.reset()
        else:
            invalid()
            self.reset()

    def reset(self):
        self.addprodname.text = ''
        self.addprodprice.text = ''

Edit2:

我不想一次更改标签的文本,但是我想每次调用一个函数(按钮按下)时更改标签的文本:例如,每当我在文本输入中写东西并按下按钮时,我都想更改标签的文本文本到我在Textinput中编写的内容,不仅一次,而且每次按下按钮时都可以。 (对不起,让自己不清楚(英语不是我的母语))

4 个答案:

答案 0 :(得分:1)

这是您修改的代码版本,可以执行您想要的操作:

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.screenmanager import Screen, ScreenManager


class Screen_two(Screen):
    # StringProperty that will be the Label text
    productsamount = StringProperty('This is going to change')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # change label after 5 seconds
        Clock.schedule_once(self.update_amount_label, 5)

    def update_amount_label(self, dt):
        n = 0
        for i in range(5):
            n += 1

        # update label text
        self.productsamount = 'Amount of goods: {}'.format(n)

Builder.load_string('''
<Screen_two>:
    Label:
        text: root.productsamount    # use the StringProperty for Label text
        font_size:'11dp'
''')

class tmpApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(Screen_two(name='screen2'))
        return sm

tmpApp().run()

答案 1 :(得分:1)

尝试类似这样的方法。您具有对事件具有本机支持的按钮。

例如,它具有“ on_press”或“ on_release”。对于这些事件,您可以附加将被触发的功能。

py:

class Screen_two(Screen):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


    def update_amount_label(self):
        n = 0
        for i in db.databaseDict.items():
            n += 1
        self.ids.productsamount.text = 'Amount of goods: {}'.format(n)

kv:

<Screen_two>:
    productsamount: productsamount
    Label:
        font_size:'11dp'
        id:productsamount

    Button:
        on_press: root.update_amount_label()

ps:我没有测试过,但是我认为它应该可以工作

答案 2 :(得分:1)

本教程可能会帮助您解决以下问题: https://www.youtube.com/watch?v=-NvpKDReKyg

答案 3 :(得分:1)

我认为这应该有所帮助


Private Sub Userform_Initialize() 

'Empty preset name combo box 

presetname.value = ""

With Sheet6
   Range("A2", Range("A" & Rows.count).end(xlUp)).name = "presetnamerange"
End With 
   Me.presetname.rowsource = "presetnamerange"

End Sub



'I have a sub for the combo box but I'm not sure what to put in it

Sub presetname_change()

With Sheet6

'????

End With 

End Sub 




这将帮助您更好地理解