#python #kivy
#python #kivy
Вопрос:
У меня есть объект «Streak», который я хочу иметь возможность создавать при нажатии кнопки. У меня есть несколько текстовых вводов и кнопка. Я хочу, чтобы кнопка могла получать все входные данные и сохранять их в объекте «Streak». Как бы я это сделал? Вот код .kv:
<ScreenOne>:
name: "one"
AnchorLayout:
anchor_x: 'left'
anchor_y: 'top'
Button:
on_release: app.root.current = "main"
text: "Back"
size: 50, 25
size_hint: None, None
font_size: 18
GridLayout:
cols:1
rows:6
Label:
text: "Action"
font_size: 18
size: 600, 50
size_hint: None, None
TextInput:
id: action_entry
multiline: False
size: 600, 28
size_hint: None, None
Label:
text: "Streak #"
size: 600, 50
size_hint: None, None
TextInput:
id: streak_entry
multiline: False
size_hint: None, None
size: 600, 28
Label:
size: 600, 50
size_hint: None, None
text: "Due every"
GridLayout:
cols:3
rows:2
Label:
text: "Day(s)"
size_hint: None, None
font_size: 18
Label:
text: "Hour(s)"
size_hint: None, None
font_size: 18
Label:
text: "Minute(s)"
size_hint: None, None
font_size: 18
TextInput:
id: day_entry
multiline: False
size_hint: None, None
size: 200, 28
TextInput:
id: hour_entry
multiline: False
size_hint: None, None
size: 200, 28
TextInput:
id: minute_entry
multiline: False
size_hint: None, None
size: 200, 28
AnchorLayout:
anchor_x: "right"
anchor_y: "bottom"
Button:
text: "Add"
size: 50, 25
size_hint: None, None
font_size: 18
on_press: Streak.create(instance)
Вот код .py:
class Streak():
def __init__(self, action, action_num, day, hour, minute):
self.action = action
self.action_num = action_num
self.day = day
self.hour = hour
self.minute = minute
class MainScreen(Screen):
pass
class ScreenOne(Screen):
pass
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("StreakStar.kv")
class MainApp(App):
def build(self): # build() returns an instance
return presentation
def create(self, instance):
streak = Streak(action_entry.text, streak_entry.text, day_entry.text,
hour_entry.text, minute_entry.text)
if __name__ == '__main__':
MainApp().run()
Когда я нажимаю кнопку, я получаю ошибку имени: имя ‘Streak’ не определено
Ответ №1:
Основная причина
При Add
нажатии кнопки он попытался вызвать Streak.create(instance)
, но нет экземпляра объекта по имени, Streak
поэтому он выдал следующую ошибку:
Ошибка имени: имя ‘Streak’ не определено
Решение
kv-файл
- Заменить
Streak.create(instance)
наapp.create()
Фрагменты
Button:
text: "Add"
size: 50, 25
size_hint: None, None
font_size: 18
on_press: app.create()
py-файл
- Перепишите метод
create()
следующим образом:
Фрагменты
def create(self):
obj = self.root.get_screen('one')
self.streak = Streak(obj.ids.action_entry.text, obj.ids.streak_entry.text, obj.ids.day_entry.text,
obj.ids.hour_entry.text, obj.ids.minute_entry.text)
Ответ №2:
Все идентификаторы уже сохранены в ids
библиотеке — предполагая, что вы хотите использовать эту переменную как строку, вы можете просто объединить требуемые идентификаторы.
Причина, по которой вы получаете сообщение об ошибке, заключается в том streak
, что оно ранее не определено в вашей функции.
def create(self):
streak = ""
streak = self.ids.action_entry.text ", "
self.ids.streak_entry.text ", "
self.ids.day_entry.text....
Выдаст вам строку из этих ids