在 kv 文件中从 python 导入值

Posted

技术标签:

【中文标题】在 kv 文件中从 python 导入值【英文标题】:import value from python in kv file 【发布时间】: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'

【问题讨论】:

【参考方案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

希望对你有所帮助

【讨论】:

数以百万计的感谢。哇。你解决了我的大问题。我的主程序和我说的有点不同,所以我必须在它上面做更多的工作。但是,从逻辑上讲,我理解如何解决它。祝你有个美好的一天。 很高兴我能帮上忙。有一个伟大的

以上是关于在 kv 文件中从 python 导入值的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中从我的模块中的另一个文件夹导入模块函数

在 Python 3 中从同一包内和包外导入模块

在 Python 中从导入的模块导入时输出 [重复]

尝试在 Visual Studio 2013-15 中从 C++ 执行 python 脚本时出现导入错误

如何在 Python 中从 Javascript 中读取值

在 google colab 中从 .pyx 文件导入