Фреймворк Kivy — самое питоновское решение с обновлением ввода текста / метки?

#python #python-3.x #kivy

#python #python-3.x #kivy

Вопрос:

Я работал с Kivy и Python 3 и столкнулся с проблемой. У меня есть 2 виджета в BoxLayout, один виджет TextInput и один виджет Label. Когда некоторый текст вводится в виджет TextInput и нажата клавиша enter, я хотел бы Label.text обновить, чтобы отразить TextInput.text .

Я собрал решение, которое работает. Вот код (вопрос после перерыва):

 from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class TexttestApp(App):
    def on_enter(self,textin):
        self.lab.text = textin.text #is this incorrect?

    def build(self):
        window = BoxLayout()
        self.lab = Label(text="Inital Label") #is this incorrect?
        text = TextInput(multiline=False)
        text.bind(on_text_validate=self.on_enter)
        window.add_widget(text)
        window.add_widget(self.lab) 
        return window
  

Мои вопросы заключаются в следующем:
Является ли назначение виджета Label переменной экземпляра плохой практикой программирования? С точки зрения разработки программного обеспечения, это плохо / сбивает с толку? Или я должен назначать все мои виджеты экземпляру класса TexttestApp? (т. Е. self.text , self.window и т.д.). Код прямо сейчас выглядит для меня неорганизованным, но я не могу придумать другого способа решения проблемы.

Заранее спасибо. Это моя первая попытка использовать bind() для привязки функции к событию клавиатуры.

Ответ №1:

Для меня все выглядит нормально. Полагаю, в принципе я мог бы придираться ко всему, но на самом деле в таком маленьком фрагменте кода нет ничего особо важного, поскольку вы не делаете ничего действительно неправильного. Материал, который вы комментируете, в общих чертах прекрасен, и нет правила, запрещающего хранить материал в качестве атрибутов вашего приложения, хотя могут быть лучшие или более удобные альтернативы (как показано ниже).

С точки зрения kivy, вероятно, самое главное…используйте язык kv! В этом случае у вас мог бы быть файл texttest.kv с

 BoxLayout:
    TextInput:
        multiline: False
        on_text_validate: the_label.text = self.text
    Label:
        id: the_label
        text: "Initial Label"
  

Это заменило бы оба метода вашего класса app. Это очень похоже на ваш пример по длине, поскольку оно очень простое, но я бы сказал, что оно уже немного понятнее — и kv быстро становится намного понятнее и менее подробным по мере усложнения, поскольку оно автоматически обрабатывает множество привязок.

В этом примере также избегается привязка к вашей собственной функции для изменения текста метки, поскольку все это можно выполнить в строке kv, но ваш способ не является неправильным, и все еще может быть уместно вызвать метод или функцию в файле python, если задача сложнее.