#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()