【问题标题】:Need to pass variable to new screen, then read it and use it需要将变量传递到新屏幕,然后读取并使用它
【发布时间】:2017-10-24 06:22:18
【问题描述】:

如何根据我使用 Kivy 和 Python 按下的按钮来更改第二个屏幕的颜色/图像?这是说明我的问题的代码。

Python:

startvalue = 0


class Start(Screen):
    pass


class End(Screen):
    global startvalue

    def which_color(self):
        if startvalue == 1:
            self.bg_image.source = 'blue.png'
        elif startvalue == 2:
            self.bg_image.source = 'red.png'
        elif startvalue == 3:
            self.bg_image.source = 'yellow.jpg'
        elif startvalue == 4:
            self.bg_image.source = 'green.jpg'

基维:

#: import startvalue __kivyseeing__.startvalue

ScreenManagement:
    Start:
    End:

<Start>:
    startvalue: startvalue
    id: start
    name: 'start'

    BoxLayout:

        Button:
            name: 'btn1'
            id: btn1
            text: "btn1"
            on_release:
                startvalue = 1
                app.root.current = 'end'

        Button:
            name: 'btn2'
            id: btn2
            text: "btn2"
            on_release:
                startvalue = 2
                app.root.current = 'end'

        Button:
            name: 'btn3'
            id: btn3
            text: "btn3"
            on_release:
                startvalue = 3
                app.root.current = 'end'

        Button:
            name: 'btn4'
            id: btn4
            text: "btn4"
            on_release:
                startvalue = 4
                app.root.current = 'end'


<End>:
    id: end
    name: "end"
    endbtn: endbtn
    bg_image: bg_image

    on_pre_enter: self.which_color()

    Image:
        id: bg_image
        source: ""
        allow_stretch: True

    Button:
        name: 'endbtn'
        id: endbtn
        text: "end"
        size_hint_y: .35
        size_hint_x: .25
        on_release: app.root.current = 'start'

我意识到全局变量可能非常危险,我宁愿不使用它们,但我不知道它还能如何工作。另外,我想知道如何在 Kivy 中更改 Python 全局变量,然后在第二个类中使用它们以确定屏幕背景。

【问题讨论】:

  • 如果您已经在使用类,则根本不需要全局变量。在def __init__(self): 部分中将startvalue 指定为self.startvalue,您将能够在构造函数或实例中的任何位置访问它。

标签: python python-3.x kivy kivy-language


【解决方案1】:

解决方案是使用 Kivy NumericProperty 并将其连接起来。详情请参考以下示例。

示例

main.py

​​>
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import NumericProperty


class ScreenManagement(ScreenManager):
    pass


class Start(Screen):
    startvalue = NumericProperty(0)


class End(Screen):

    def which_color(self, startvalue):
        print("startvalue={}".format(startvalue))
        if startvalue == 1:
            self.bg_image.source = 'blue.png'
        elif startvalue == 2:
            self.bg_image.source = 'red.png'
        elif startvalue == 3:
            self.bg_image.source = 'yellow.jpg'
        elif startvalue == 4:
            self.bg_image.source = 'green.jpg'


class TestApp(App):
    def build(self):
        return ScreenManagement()


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

test.kv

#:kivy 1.10.0

<ScreenManagement>:
    Start:
        id: start
    End:
        startvalue: start.startvalue

<Start>:
    name: 'start'

    BoxLayout:

        Button:
            name: 'btn1'
            id: btn1
            text: "btn1"
            on_release:
                root.startvalue = 1
                app.root.current = 'end'

        Button:
            name: 'btn2'
            id: btn2
            text: "btn2"
            on_release:
                root.startvalue = 2
                app.root.current = 'end'

        Button:
            name: 'btn3'
            id: btn3
            text: "btn3"
            on_release:
                root.startvalue = 3
                app.root.current = 'end'

        Button:
            name: 'btn4'
            id: btn4
            text: "btn4"
            on_release:
                root.startvalue = 4
                app.root.current = 'end'


<End>:
    id: end
    name: "end"
    endbtn: endbtn
    bg_image: bg_image

    on_pre_enter: self.which_color(root.startvalue)

    Image:
        id: bg_image
        source: ""
        allow_stretch: True

    Button:
        name: 'endbtn'
        id: endbtn
        text: "end"
        size_hint_y: .35
        size_hint_x: .25
        on_release: app.root.current = 'start'

输出

【讨论】:

    【解决方案2】:

    您尝试使用第一个屏幕中的值:

    <End>:
        id: end
        name: "end"
        endbtn: endbtn
        bg_image: bg_image
    
        on_pre_enter: 
            self.which_color(self.manager.get_screen('start').startvalue)
    

    在python文件中:

    def which_color(self, startvalue):
        ...
    

    【讨论】:

    • @AdamCottrell - 没问题的伙伴
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多