如何在Kivy中跨模块共享变量

时间:2018-06-29 18:42:22

标签: python variables kivy

我正在尝试在.py文件中声明一个可以在我的.kv文件中使用的变量。我在App类中声明了变量,并在.kv文件中调用了该变量,但出现错误。

这是我的.py

Debug.Print ie.document.querySelector("input[name='points']").getAttribute("value")

这是我的.kv

class SwitchScreenU553(Screen):
    pass

presentation = Builder.load_file("kivy.kv")

class MainApp(App):
    MY_NUMBER = .8
    def build(self):
        return presentation

当我尝试使用它时,出现以下错误:

AttributeError

这似乎对其他人有用,但是我显然做错了。

2 个答案:

答案 0 :(得分:0)

我会尝试回答您的问题,我不太了解kivy的语言,但我了解python和全局变量,首先在python中,您需要将self设置为属性,所以我认为您应该具备:

class MainApp(App):
self.MY_NUMBER = .8
def build(self):
    return presentation

第二步,您需要导入模块”,其中的类“ MainApp”如下:

#from module import MainApp
<SwitchScreenU553>:
name: "switchU553"
canvas.before:
    Rectangle:
        pos: self.pos
        size: self.size
        source: 'background.png'
FloatLayout:
    ToggleButton:
        text: "HB"
        color: 1,1,1,1
        font_size: app.MY_NUMBER
        size_hint: 0.13,0.4
        pos_hint: {"center_x":(0.3/8)+.05, "center_y":.8}

这就是我的想法。

答案 1 :(得分:0)

说明

如果在print()之前和之后,presentation = Builder.load_file("kivy.kv")之前和MainApp().run()之前添加return presentation函数,您会注意到 Builder.load_file() 方法首先执行。那时, app MY_NUMBER 不存在,这导致 AttributeError

解决方案

有两种解决方案,如下所示:

  1. presentation = Builder.load_file("kivy.kv")移动到build()方法,即在return presentation之前,或
  2. return presentation替换为return Builder.load_file("kivy.kv"),然后删除presentation = Builder.load_file("kivy.kv")

其他错误

kv文件-无根窗口小部件

kivy.kv 中,没有定义 根窗口小部件 。因此,它将返回 None ,并且不会显示任何窗口。

解决方案是将类规则<SwitchScreenU553>:替换为根规则SwitchScreenU553:

Python文件-MY_NUMBER / font_size

文本的font_size是一个整数,默认为12。因此,将 MY_NUMBER = 0.8 分配给 font_size 会导致分配了零且没有文本(“ HB”)显示。

解决方案是将 0.8 替换为 8

How to load KV

  

Builder :您可以告诉Kivy直接加载字符串或文件。如果此字符串或文件定义了根窗口小部件,它将由   方法:

Builder.load_file('path/to/file.kv')
     

或:

Builder.load_string(kv_string

Kv language » Rule context

The root rule is declared by declaring the class of your root widget, without any indentation, followed by : and will be set as the root attribute of the App instance:

    Widget:

A class rule, declared by the name of a widget class between < > and followed by :, defines how any instance of that class will be graphically represented:

    <MyWidget>:

示例

main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder


class SwitchScreenU553(Screen):
    pass


class MainApp(App):
    MY_NUMBER = 8

    def build(self):
        return Builder.load_file("kivy.kv")


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

kivy.kv

#:kivy 1.10.0

SwitchScreenU553:     # root rule
    name: "switchU553"
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'background.png'
    FloatLayout:
        ToggleButton:
            text: "HB"
            color: 1,1,1,1
            font_size: app.MY_NUMBER
            size_hint: 0.13,0.4
            pos_hint: {"center_x":(0.3/8)+.05, "center_y":.8}

输出

Img01