Как исправить экран, который не отображается после функции? - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу сохранить объект, а затем перейти к следующему экрану. Код, который я имею, только сохраняет объект и остается на той же странице. Моя главная проблема, я думаю, это возможность соединить мой код kv и код python. Я думаю, что программа не знает, что переменная для ScreenTwo. Как бы я это исправить? Это код, который, вероятно, влияет на него:

class MainScreen(Screen):
    pass

class ScreenOne(Screen):
    pass

class ScreenTwo(Screen):
    pass

class ScreenManagement(ScreenManager):
    main_screen = ObjectProperty(None)
    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)

presentation = Builder.load_file("StreakStar.kv")

class MainApp(App):
    def build(self): # build() returns an instance
        self.store = JsonStore("streak.json")

        return presentation

    def change_screen(self, *args):
        ScreenManagement.current = "ScreenTwo"

    def display_btn(self):
        obj = self.root.get_screen('one')

        for key in self.store:
            streak_button = Button(text=key)
            obj.ids.streak_zone.add_widget(streak_button)


    # creates the Streak object
    def create(self):
        obj = self.root.get_screen('one') # get info from ScreenOne
        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)

        empty_error = "Make sure to fill out all boxes!"

        popup = Popup(title="Not filled", content=Label(text=empty_error),
                     size_hint=(None, None), size=(300, 100))



        # error handling and calculating total seconds
        parsed = False
        try:
            total = ((int(self.streak.day) * 86400) + (int(self.streak.hour) * 3600) +
                    (int(self.streak.minute) * 60)) # convert into seconds
            parsed = True
            # delete later and replace with return
            print("[seconds:", total,']' , "[action:", self.streak.action,']',
                 "[action number:", self.streak.action_num,']')

            self.store.put(self.streak.action, action=self.streak.action,
                          action_num=self.streak.action_num, seconds=total,
                          score=self.streak.score)

            self.change_screen(self)

        except ValueError as error:
            popup.open()

.kv код:

ScreenManagement:
    id: screen_manager

    main_screen: main_screen
    screen_one: screen_one
    screen_two: screen_two

    transition: SlideTransition()

    MainScreen:
        id: main_screen
        name: "main"
        manager: screen_manager

    ScreenOne:
        id: screen_one
        name: "one"
        manager: screen_manager

    ScreenTwo:
        id: screen_two
        name: "two"
        manager: screen_manager

...

        Button: # this button is apart of ScreenOne
            text: "Add"
            size: 50, 25
            size_hint: None, None
            font_size: 18
            on_press: app.create()

<ScreenTwo>
    id: screen_two
    name: "two"
    GridLayout:
        cols: 2
        rows: 1
        BoxLayout:
            id: streak_zone
            orientation: 'vertical'
        AnchorLayout:
            anchor_x: "center"
            anchor_y: "center"
            Label:
                id: high_lable
                text: "Highest Streak: "
                size_hint: None, None
                font_size: 20

Ответы [ 2 ]

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

Вы звоните change_screen из класса ScreenManagement.current = "ScreenTwo".поскольку ваш менеджер - ваш root, попробуйте self.root.current

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

Экран переключения

После вызова метода create(), если вы хотите перейти к ScreenTwo, замените ScreenManagement.current = "ScreenTwo" на self.root.current = 'two'

Snippets

def change_screen(self, *args):
    self.root.current = "two"

Доступ к атрибутам на другом экране

Поскольку вы использовали ObjectProperties для соединения экранов, вы можете получить доступ к переменным в ScreenTwo двумя способами.

Метод 1

Использование self.root.screen_one.ids.id_name или self.root.screen_two.ids.id_name

Фрагменты

self.root.screen_one.ids.action_entry.text
self.root.screen_one.ids.streak_entry.text
self.root.screen_one.ids.day_entry.text
self.root.screen_one.ids.hour_entry.text
self.root.screen_one.ids.minute_entry.text

self.root.screen_two.ids.streak_zone
self.root.screen_two.ids.high_lable.text

Метод 2

Вы уже используетеодин из них, т.е. obj = self.root.get_screen('one')

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