kivy: Как обновить свойство объекта?

У меня есть скрипт python и файл kivy для создания интерфейса.

Я хочу динамически обновлять текст внутри метки через ввод pythons (сетевой ввод).

Итак, я создал свойство для основного виджета kivy:

class UserForm(BoxLayout):
    txt = StringProperty("")

внутри kivy я использую on_txt для вызова некоторых изменений внутри виджетов ниже:

<UserForm>:
    orientation: 'vertical'
    name: name_input.text
    barcode: barcode_input.text
    on_txt: print ("Aha"); barcode_label.text = "I CHANGED FOR THE BETTER"
    Label:
        id: barcode_label
        text: "barcode (EAN or SN):"
        font_size: 30

Он печатает «Ага» и не выдает ошибок, но также не меняет текст метки.

Оцените любую помощь или подсказку!


person gauguerilla    schedule 16.04.2016    source источник


Ответы (1)


сделать это в питоне

class UserForm(Screen):
  on_enter(self):
    self.barcode_label.text='I CHANGED FOR THE BETTER'

это изменит код на этот каждый раз, когда вы входите в экран. Альтернатива, если вы хотите что-то еще, попробуйте это

class UserForm(Screen):
    def changetext(self):
        self.barcode_label.text='I CHANGED FOR THE BETTER'

а в ur kv файле сделай так

<UserForm>:
    orientation: 'vertical'
    name: name_input.text
    barcode: barcode_input.text
    barcode_label:barcode_label
    Label:
        id: barcode_label
        text: "barcode (EAN or SN):"
        font_size: 30
    Button:
        text: 'press me'
        pos_hint:{"center_x":0.5,"center_y":0.3}
        size_hint:(0.1,0.1)
        on_press:root.changetext()

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

person Abul    schedule 16.04.2016
comment
спасибо! 2-й был тем, что я искал. 1-й кажется еще более привлекательным, но быстрый тест не дал того эффекта, которого я желал (остался на тексте, определяемом языком kivy). - person gauguerilla; 16.04.2016
comment
но продолжайте: как мне вызвать метод changetext() из python и получить то же обновление? например когда у меня есть другой поток, работающий с сервером, ожидающим сетевых сигналов, или если python обрабатывает входные данные, прежде чем передавать их обратно в виджеты kivy... - person gauguerilla; 16.04.2016
comment
я не думаю, что вы можете вызвать эту функцию вне этого класса. Но объясните, чего именно вы хотите, я постараюсь помочь вам, если вы хотите обновить экран, я могу помочь вам с этим или чем-то еще? не могли бы вы объяснить свою программу немного больше, чтобы я понял, что вам нужно делать - person Abul; 16.04.2016
comment
большое спасибо! я думаю, вы правы: моя проблема заключается в регулярном обновлении экрана. моя программа делает следующее: 1) python открывает OSC-сервер и прослушивает входные данные на порту 2) он создает с помощью kivy пользовательский интерфейс, где пользователь может вводить некоторые данные, которые отправляются по сети (работает до сих пор) 3) когда данные с другого компьютера поступают на сетевой порт сценария, который я слушаю (вне основного цикла kivy, который был бы), я хочу, чтобы прослушиватель событий для сетевого ввода передал входящие данные в kivy для отображения это там. - person gauguerilla; 16.04.2016