#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, если задача сложнее.