Как создать объект после нажатия кнопки в киве? - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть объект «Полоска», который я хочу создать при нажатии кнопки. У меня есть несколько TextInputs и кнопка. Я хочу, чтобы кнопка могла получить все входные данные и сохранить их в объекте "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()

Когда я нажимаю кнопку, я получаю NameError: имя 'Streak' не определено

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

первопричина

Когда нажата кнопка Add, он попытался вызвать Streak.create(instance), но не существует экземпляра объекта с именем Streak. Поэтому он выдал следующую ошибку:

NameError: имя 'Streak' не определено

Решение

файл кв

  • Заменить 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)
0 голосов
/ 14 апреля 2019

Все идентификаторы уже хранятся в библиотеке ids - при условии, что вы хотите использовать эту переменную в качестве строки, вы можете просто объединить требуемые идентификаторы.

Причина, по которой вы получаете ошибку, заключается в том, что streak ранее не было определено в вашей функции.

def create(self):
    streak = ""
    streak = self.ids.action_entry.text +", "+
             self.ids.streak_entry.text +", "+
             self.ids.day_entry.text....

Даст вам строку этих ids

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