从 Spinner on_text 问题更改屏幕

Changing screens from a Spinner on_text problem

我想使用 ScreenManager 创建一种工作流程,随着选项 selected 的进行。我在 ScreenManager 中定义了多个屏幕,在一个屏幕中我创建了一个带有多个选项的 Spinner。我想从 on_text 调用函数并传递 selected Spinner 值,根据传递的值执行任务,然后移动到工作流中的下一个屏幕。

我在 class(屏幕)中创建了一个函数,其中只有一个 print() 用于测试目的。当我 select 来自 Spinner 的选项时,没有任何反应。

我只提供了我认为相关的代码...

kv 文件:

<HomeScreen>:
    name: 'homeScreen'
    BoxLayout:
        orientation: 'horizontal'

        Label:
            id: 'home'
            text: 'Home Screen'


<NewSession>:
    name: 'newSession'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: new
            text: 'Create New Session'

        Spinner:
            size_hint: None, None
            size: 100, 25
            id: category
            font_size: 12
            text: "Food Category" #default value showed
            values: ["Beef","Pork","Poultry", "Fish"] #list of values to show
            on_text: root.SelectCut(category.text)

        Widget:


<CurrentSession>:
    id: cs
    name: 'currentSession'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: cSession
            text: root.cSession

<History>:
    name: 'history'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: 'history'
            text: 'History Data Screen'

<ScreenManagement>:
    HomeScreen:
    NewSession:
    CurrentSession:
    History:

<AllScreen>:

    orientation: 'vertical'
    ScreenManagement:
        id: sm
    BoxLayout:

        size_hint_y: None
        height: 60
        spacing: 5
        padding: 5, 5, 0, 5

        Button:
            text: 'Home'
            on_press: root.ids.sm.current = 'homeScreen'
        Button:
            text: 'New Session'
            on_press: root.ids.sm.current = 'newSession'
        Button:
            text: 'Current Session'
            on_press: 
                root.ids.sm.current = 'currentSession'
        Button:
            text: 'History'
            on_press: root.ids.sm.current = 'history'

py 文件:

Builder.load_file("screenLayout.kv")

class ScreenManagement(ScreenManager):
    pass

class HomeScreen(Screen):
    pass

class NewSession(Screen):

    def SelectCut(self, text):
        print("In Select Cut")
        print("Food Category: " + text)
        self.sm.current = 'homeScreen'

class CurrentSession(Screen):
    pass

class History(Screen):
    pass

class AllScreen(BoxLayout):
    pass

class WorkingTestApp(App):

    def build(self):
        self.root = AllScreen()
        return self.root

if __name__ == '__main__':
    WorkingTestApp().run()

我无法弄清楚为什么当 selection 从 Spinner 生成时什么也没有发生,我不确定函数中移动到下一个的语法是什么屏幕.


更新: 当前代码(减去导入)

kv:

<HomeScreen>:
    name: 'homeScreen'
    BoxLayout:
        orientation: 'horizontal'

        Label:
            id: 'home'
            text: 'Home Screen'

<NewSession>:
    name: 'newSession'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: new
            text: 'Create New Session'

        Spinner:
            size_hint: None, None
            size: 100, 25
            id: category
            font_size: 12
            text: "Food Category" #default value showed
            values: ["Beef","Pork","Poultry", "Fish"] #list of values to show
            on_text: root.SelectCategory()

        Widget:

<SelectCut>:
    name: 'selectCut'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: 'cut'
            text: 'Select Cut Screen'

        Widget:

<CurrentSession>:
    name: 'currentSession'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: cSession
            text: 'Current Session Screen'

<History>:
    name: 'history'
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: 'history'
            text: 'History Data Screen'

<ScreenManagement>:
    HomeScreen:
    NewSession:
    SelectCut:
    CurrentSession:
    History:

<AllScreen>:
    orientation: 'vertical'
    ScreenManagement:
        id: sm
    BoxLayout:

        size_hint_y: None
        height: 60
        spacing: 5
        padding: 5, 5, 0, 5

        Button:
            text: 'Home'
            on_press: root.ids.sm.current = 'homeScreen'
        Button:
            text: 'New Session'
            on_press: root.ids.sm.current = 'newSession'
        Button:
            text: 'Current Session'
            on_press: 
                root.ids.sm.current = 'currentSession'
        Button:
            text: 'History'
            on_press: root.ids.sm.current = 'history'

py:

Builder.load_file("screenLayout.kv")

class ScreenManagement(ScreenManager):
    pass

class HomeScreen(Screen):
    pass

class NewSession(Screen):
    # This Function isn't executing consistently.
    def SelectCategory(self):
        print("Food Category: " + self.ids.category.text)
        self.manager.current = 'selectCut'

class SelectCut(Screen):
    pass

class CurrentSession(Screen):
    pass

class History(Screen):
    pass

class AllScreen(BoxLayout):
    pass

class WorkingTestApp(App):

    def build(self):
        self.root = AllScreen()
        return self.root

if __name__ == '__main__':
    WorkingTestApp().run()

将微调器的 on_text: root.SelectCut(self, text) 更改为 on_text: root.SelectCut() 在您的 .py 中将 def SelectCut(self, text): 更改为 def SelectCut(self): 然后更改您可以使用 self.ids.category.text 的文本读取或更改微调器的文本并将 root.ids.sm.current = 'your screen' 添加到此函数中