Использование глобальных переменных с Kivy Screen Manager - PullRequest
0 голосов
/ 18 июня 2020

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

Я сделал сетка с 2 столбцами: флажки и метки. Я составил списки из этих столбцов и заархивировал их вместе, чтобы получить «результирующий» список элементов, в которых соответствующие индексы флажков имеют состояние «вниз».

Однако я не могу обновить это result список из класса ShopInput в класс SecondWindow.

Я пробовал много вещей, которые я нашел здесь, но, похоже, я полностью застрял. Может ли кто-нибудь посоветовать мне, как продолжить обновление списка результатов на втором экране?

Мой код:

shoppinglist.py:

import kivy
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.checkbox import CheckBox
from kivy.uix.scrollview import ScrollView
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder

result = ["test", "test2", "test3"]

item_dictionary = {
    "item1": "Cookies",
    "item2": "Milk",
    "item3": "Honey"
}


class ShopInput(Screen):
    obj_listitem1 = ObjectProperty(None)
    obj_listitem2 = ObjectProperty(None)
    obj_listitem3 = ObjectProperty(None)

    def button_press(self):
        products = list(item_dictionary.values())

        added_item_list = []
        added_item_list.append(self.obj_listitem1.state)
        added_item_list.append(self.obj_listitem2.state)
        added_item_list.append(self.obj_listitem3.state)

        global result
        result.clear()
        result.append([x for x, y in zip(products, added_item_list) if y == 'down'])

        print(result)  # Temporarily to see what gets added to the result list
        added_item_list.clear()


class SecondWindow(Screen):

    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)
        global result
        self.add_widget(Label(text=(f'{result}')))


class WindowManager(ScreenManager):
    pass


kv = Builder.load_file("shoppinglist.kv")


class ShoppingListApp(App):
    def build(self):
        return kv


if __name__ == "__main__":
    ShoppingListApp().run()



список покупок. кв:

WindowManager:
    ShopInput:
    SecondWindow:

<ShopInput>:
    name: "first"

    obj_listitem1: listitem1
    obj_listitem2: listitem2
    obj_listitem3: listitem3

    GridLayout:
        cols: 1
        rows: 3
        size: root.width, root.height
        padding: 2

        Label:
            text:"Make Your Shopping List"
            size_hint_y:0.2

        ScrollView:
            do_scroll_x: False
            do_scroll_y: True
            size_hint_y:0.675

            GridLayout:
                cols: 2
                size_hint_y: 1.5
                height: self.minimum_height

                Label:
                    text: "Add to list:"

                Label:
                    text: "Product:"

                CheckBox:
                    id: listitem1

                Label:
                    text: "Cookies"

                CheckBox:
                    id: listitem2

                Label:
                    text: "Milk"

                CheckBox:
                    id: listitem3

                Label:
                    text: "Honey"

        GridLayout:
            cols: 2
            size_hint_y:0.075

            Button:
                text:"Add"
                on_press: root.button_press()

            Button:
                text:"Next"
                on_release: root.manager.current = "second"

<SecondWindow>:
    name: "second"


Спасибо!

1 Ответ

0 голосов
/ 18 июня 2020

Вы пытаетесь установить текст Label для SecondWindow в его методе __init__(), который вызывается во время Builder.load_file(), задолго до того, как пользователь что-либо выбрал. Попробуйте изменить класс SecondWindow на:

class SecondWindow(Screen):

    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)
        print('init')

    def on_enter(self, *args):
        global result
        self.add_widget(Label(text=(f'{result}')))

Это задержит установку Label text до отображения SecondWindow, используя метод on_enter() из Screen.

...