Запуск экранного менеджера для изменения экрана в Kivy из условного условия - PullRequest
0 голосов
/ 09 ноября 2019

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

Чтобы программа могла определить момент нажатия на счетчики (день, час и минуты), я назначил значение True для state в коде .kv для каждого счетчика. Диспетчер экрана переключится с screen_two на screen_three, только если все счетчики имеют state: True. Я присваиваю True при нажатии на спиннер (и выбирается опция).

Большая часть кода работает, как и ожидалось, за исключением оператора if в коде kv, который я показал ниже.

Я удалил большую часть своего кода и сохранил только соответствующие фрагменты.

Файл .kv

<ScreenTwo>:
    FloatLayout:
        Button:
            background_color: 0, 0, 0, 1
            size: (400, 130)
            size_hint: (None, None)
            pos_hint: {'right': 0.6, 'center_y': 0}
            on_press:
                root.hours_checking() #this function converts the 12hr time to 24hr time

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

                if day.state == hours.state == minutes.state == AmPm.state == 'True': \
                root.manager.current = 'screen_three'
        Spinner:
            id: day
            size_hint: None, None
            size: 100, 44
            pos_hint: {'center': (.5, .5)}
            text: 'Day'
            values: 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'
            on_text:
                root.on_day_select(self.text) #this function sends back the selected day value in the spinner
                self.state: 'True'
        Spinner:
            id: hours
            size_hint: None, None
            size: 100, 44
            pos_hint: {'center': (.1, .5)}
            text: 'Hour'
            values: '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'
            on_text:
                root.on_hours_select(self.text) #this function sends back the selected hours value in the spinner
                self.state: 'True'
        Spinner:
            id: minutes
            size_hint: None, None
            size: 100, 44
            pos_hint: {'center': (.3, .5)}
            text: 'Minutes'
            values: '00', '15', '30', '45'
            on_text:
                root.on_minutes_select(self.text) #this function sends back the selected minutes value in the spinner
                self.state: 'True'
        Spinner:
            id: AmPm
            size_hint: None, None
            size: 100, 44
            pos_hint: {'center': (.4, .5)}
            text: 'AM/PM'
            values: 'a.m', 'p.m'
            on_text:
                root.on_AmPm_select(self.text) #this function sends back the selected day a.m/p.m value in the spinner
                self.state: 'True'

Файл Python

class ScreenTwo(Screen):
    def on_day_select(self, text): #Function assigns selected day from spinner to a variable
        global day
        day = str(text)
    def on_hours_select(self, text): #Function assigns selected 12-hour from spinner to a variable
        global hours
        hours = int(text)
    def on_minutes_select(self, text): #Function assigns selected minute from spinner to a variable
        global minutes
        minutes = int(text)
    def on_AmPm_select(self,text): #Function assigns selected a.m/p.m from spinner to a variable
        global AmPm
        AmPm = str(text)
    def hours_checking(self): #Function converts 12hr time to 24hr time
        global AmPm
        global hours
        global minutes
        global day
        try:
            if 1 <= hours <= 11 and AmPm == 'a.m':
                pass
            elif 1 <= hours <= 12 and AmPm == 'p.m':
                hours += 12
            elif hours == 12 and AmPm == 'a.m':
                hours = 0
        except:
            print('error')
        else:
            print(day, hours, minutes)
    pass

Когда этот код запущен, и я нажимаюкнопка, я получаю 12-часовое время в 24-часовом формате времени. Это означает, что все до тех пор, пока часть screenmanager в файле kv (который показан в блоке кода, выделен в желтой части) работает отличноЯ очень плохо знаком с Киви и ООП, поэтому, пожалуйста, помогите мне понять, где именно я ошибся.

1 Ответ

0 голосов
/ 10 ноября 2019

Вы можете создать собственное свойство для своих целей, создав расширение Spinner, например:

class MySpinner(Spinner):
    current_selection = BooleanProperty(False)

Затем замените Spinner в вашем kv на MySpinner ивезде, где вы ссылаетесь на state из MySpinner, заменяйте его на current_selection.

...