Kivy: Как изменить значение text_hint для TextInput, которое находится в шаблоне

#python #kivy #kivy-language

#python #киви #kivy-language #kivy

Вопрос:

Я пытаюсь отобразить некоторые данные, изменив значение text_hint текстового ввода. Если я напечатаю значения, они верны, однако я не могу заставить их обновляться на экране. Вот как я объявляю и использую шаблон в файле .kv.

 <InformationBox@FloatLayout>
    lblTxtIn: 'Unknown Variable Name'
    txtInHint: "..."
    Label:
        text: root.lblTxtIn
        color: 235/255, 235/255, 235/255, 1
        pos_hint: {'center_x': 0.5, 'center_y': 0.7}
        bold: True
    TextInput:
        readonly: True
        hint_text: root.txtInHint
        multiline: False
        pos_hint: {'center_x': 0.5, 'center_y': 0.4}
        size_hint: (0.3, 0.25)
        hint_text_color: 0, 0, 0, 1
<MainMenu>:
    InformationBox:
        id: mylabel
        lblTxtIn: "Data Type Name"
        txtInHint: root.custom
  

И вот как я пытаюсь изменить значение в python.

 from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
from kivy.properties import ObjectProperty, StringProperty
import random


class MainMenu(FloatLayout):
    custom = "0"


class MyMainApp(App):
    def build(self):
        return MainMenu()

    def txt_change(self, *args):
        MainMenu.custom = str(random.randrange(1, 10))
        print(MainMenu.custom)

    Clock.schedule_interval(txt_change, 1)

if __name__ == "__main__":
    MyMainApp().run()
  

Я также попытался изменить его с помощью ObjectProperty, хотя затем он показывает ошибку, сообщающую, что у объекта нет атрибута ‘text_hint’.

 class MainMenu(FloatLayout):
    mylabel = ObjectProperty()

    def change_text(self, *args):
        MainMenu.mylabel.text_hint = "1"


class MyMainApp(App):
    def build(self):
        return MainMenu()

    Clock.schedule_interval(MainMenu.change_text, 1)
  

Я новичок и понятия не имею, совершаю ли я простую ошибку или должен подойти к проблеме совершенно по-другому. Я был бы рад, если бы кто-нибудь смог мне помочь.

Ответ №1:

Вы можете использовать следующий подход для обновления поля textinput:

 from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
import random


APP_KV = """
FloatLayout:
    lblTxtIn: "Data Type Name"
    txtInHint: "..."
    Label:
        text: root.lblTxtIn
        color: 235/255, 235/255, 235/255, 1
        pos_hint: {'center_x': 0.5, 'center_y': 0.7}
        bold: True    
    TextInput:
        id: mytxtinput
        readonly: True
        hint_text: root.txtInHint
        multiline: False
        pos_hint: {'center_x': 0.5, 'center_y': 0.4}
        size_hint: (0.3, 0.25)
        hint_text_color: 0, 0, 0, 1
"""

class MyMainApp(App):
    def build(self):
        return Builder.load_string(APP_KV)

    def txt_change(self, *args):
        app.root.ids.mytxtinput.hint_text = str(random.randrange(1, 10))
        print(app.root.ids.mytxtinput.hint_text)

    Clock.schedule_interval(txt_change, 1)

if __name__ == "__main__":
    app = MyMainApp()
    app.run()