【问题标题】:import value from python in kv file在 kv 文件中从 python 导入值
【发布时间】:2020-04-04 22:20:59
【问题描述】:

我有一个 python 代码和 kv 文件。我想在 kv 文件中使用由 python 生成的值(数组)。我更详细,我有两个屏幕。在主屏幕中, 是一个按钮。按下此按钮后,“值”将填写在 python 代码中。然后“值”的结果应显示在第二个屏幕中。 我的python代码是:

class MainWindow(Screen):
    def btn(self):
        value=k #here we define the value. it is an array
class ResultWindow(Screen):
    pass
class WindowManager(ScreenManager):
    pass
kv = Builder.load_file("my.kv")
class MyMainApp(App):
    def build(self):
        return kv
if __name__ == "__main__":
    MyMainApp().run()

然后我想在 ResultWindow 中使用这个“值”。所以,这是我的 kv 文件:

WindowManager:
   MainWindow:
   ResultWindow:
<MainWindow>
    name: "main"
    GridLayout:
        cols:1
        Button:
            on_press: root.btn()   #so here we make and access to the value
            on_release:
                app.root.current= "resultwindow"
                root.manager.transition.direction = "right"
<ResultWindow>:
    name:"resultwindow"
    GridLayout:
        rows: 1
        Label:
            text: str(root.value(0))

所以,错误是:

AttributeError: 'ResultWindow' object has no attribute 'value'

【问题讨论】:

    标签: python label kivy


    【解决方案1】:

    kivy 的奇怪之处在于它喜欢在做任何事情之前构建所有屏幕。您的应用程序的好处是至少您有一个起始屏幕,可以在您到达第二个屏幕之前更轻松地更新第二个屏幕上的标签。他们这样做的方式,您将在下面看到,是我将标签设置为空字符串,然后当调用 btn 函数时,它将值设置为您想要使用的任何值,然后将标签的文本设置为第二个屏幕基于您在函数中设置的任何内容。这是代码,仅包含值示例。

    .py:

    from kivy import *
    from kivy.app import App
    from kivy.clock import Clock
    from kivy.lang import Builder
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.properties import StringProperty
    
    
    class MainWindow(Screen):
        def btn(self):
            MyMainApp.value = ["Ford", "Volvo", "BMW"]  # here we define the value. it is an array
            #ResultWindow.ids.label_one.text(MyMainApp.value[0])
            self.manager.get_screen('resultwindow').label_start_one = MyMainApp.value[0]
    
    
    class ResultWindow(Screen):
        label_start_one = StringProperty(' ')
    
    
    class WindowManager(ScreenManager):
        pass
    
    
    kv = Builder.load_file("mymain.kv")
    
    
    class MyMainApp(App):
        def build(self):
            return kv
    
        value = None
    
    
    if __name__ == "__main__":
        MyMainApp().run()
    

    .kv:

    WindowManager:
        MainWindow:
        ResultWindow:
    
    <MainWindow>
        name: 'main'
        GridLayout:
            cols:1
            Button:
                text: 'press'
                on_release:
                    root.btn() #so here we make and access to the value
                    app.root.current= "resultwindow"
                    root.manager.transition.direction = "right"
    
    <ResultWindow>:
        name:"resultwindow"
        GridLayout:
            rows: 1
            Label:
                id: label_one
                text: root.label_start_one
    

    希望对你有所帮助

    【讨论】:

    • 数以百万计的感谢。哇。你解决了我的大问题。我的主程序和我说的有点不同,所以我必须在它上面做更多的工作。但是,从逻辑上讲,我理解如何解决它。祝你有个美好的一天。
    • 很高兴我能帮上忙。有一个伟大的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2018-05-16
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2021-08-30
    相关资源
    最近更新 更多