简体   繁体   English

单击按钮获取 Kivy 屏幕之间的值

[英]Get Values between Kivy screens on button click

I have an Kivy app that has 2 screens.我有一个 Kivy 应用程序,它有 2 个屏幕。 Screen 1 (ProblemWindow) will get the user input and screen 2 (StepsWindow) will show some images based on screen1 input.屏幕 1 (ProblemWindow) 将获得用户输入,屏幕 2 (StepsWindow) 将显示一些基于屏幕 1 输入的图像。 However, I need to pass one of the values (Spinner id: problem_id) from screen 1 (ProblemWindow) into screen 2 (StepsWindow) and also use the value in the python file for additional logic.但是,我需要将屏幕 1 (ProblemWindow) 中的一个值 (Spinner id: problem_id) 传递到屏幕 2 (StepsWindow) 中,还需要使用 python 文件中的值来实现其他逻辑。

I can pass the value between the screens but I am not able to use it in python. I need to get the updated Label Text of the StepsWindow into my python code every time I change it in my ProblemWindow and press the button "ShowSteps".我可以在屏幕之间传递值,但我无法在 python 中使用它。每次我在 ProblemWindow 中更改它并按下按钮“ShowSteps”时,我都需要将 StepsWindow 的更新 Label 文本获取到我的 python 代码中。

Could anyone please guide me how to achieve this?谁能指导我如何实现这一目标?

This is my python code:这是我的 python 代码:

# importing dependencies
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder


class WindowManager(ScreenManager):
    pass

class ProblemWindow(Screen):
    def selected_problem(self, value):
        self.ids.click_label.text = f'selected problem: {value}'
        return value

class StepsWindow(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # self.get_problem_name()
    
    def get_problem_name(self, *args):
        self.problem_name = self.ids.problem_name.text
        print(self.problem_name)

kv = Builder.load_file('main.kv')

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

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

This is my kv file for reference:这是我的 kv 文件供参考:

WindowManager:
    id: window_manager
    ProblemWindow:
        id: pw
    StepsWindow:
        id: sw

<ProblemWindow>:
    name: "problem_window"
    GridLayout:
        rows: 4
        Label:
            text: "TEST"
            font_size: 24
        Label:
            id: click_label
            text: "Select a problem"
        Spinner:
            id: problem_id
            text: "Problems List (Click here)"
            font_size: 24
            values: ["Problem_1", "Problem_2"]
            on_text: root.selected_problem(problem_id.text)
            size_hint: 0.1, 0.1
            width: 300
        Button:
            text: "Show Steps"
            font_size: 28
            size_hint: 0.2, 0.2
            pos_hint: {"center_x": 0.5, "center_y": 0.5}
            on_release:
                app.root.current = "steps_window"
                root.manager.transition.direction = "left"
<StepsWindow>:
    name: "steps_window"
    GridLayout:
        rows: 3
        size: root.width, root.height
        Label:
            id: problem_name
            text: root.manager.ids.pw.ids.problem_id.text
            font_size: '42'
            size_hint_y: None
            height: 50
        Button:
            text: "Back"
            on_release:
                app.root.current = "problem_window"
                root.manager.transition.direction = 'right'

Something like this?是这样的吗?

# importing dependencies
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder


class WindowManager(ScreenManager):
    pass


class ProblemWindow(Screen):

    def selected_problem(self, value):
        self.value = value
        self.ids.click_label.text = f'selected problem: {value}'
        return value

#logic here
    def logic_here(self):
        if self.value == "Problem_1":
            print(f'The solution for "Problem_1" is:')
        else:
            print(f'The solution for "Problem_2" is:')


class StepsWindow(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # self.get_problem_name()

    def get_problem_name(self, *args):
        self.problem_name = self.ids.problem_name.text
        print(self.problem_name)

kv = Builder.load_file('main.kv')

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

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

And for the <ProblemWindow> button in the .kv file add this:对于.kv文件中的<ProblemWindow> button添加:

root.logic_here()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM