Как разделить переменную между модулями в Kivy - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь объявить переменную в моем .py файле, которую можно использовать в моем .kv файле. Я объявляю переменную в своем классе приложения и вызываю ее в своем файле .kv, но получаю ошибку.

Вот мой .py

class SwitchScreenU553(Screen):
    pass

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

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

а вот мой .кв

<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}

Когда я пытаюсь использовать это, я получаю следующую ошибку:

AttributeError

Кажется, это работает для других, но я, очевидно, что-то делаю не так.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Объяснение

Если вы добавите функцию 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 file - No Root Widget

В kivy.kv , корневой виджет не определен. Поэтому он вернет Нет , и окно не будет отображаться.

Решение состоит в том, чтобы заменить правило класса <SwitchScreenU553>: корневым правилом SwitchScreenU553:

Файл Python - MY_NUMBER / font_size

Текст font_size является целым числом и по умолчанию равен 12. Поэтому, присваивая MY_NUMBER = 0,8 font_size , в результате ноль был назначен, а тексту нет (" HB ").

Решением является замена 0,8 на 8 .

Как загрузить КВ

Builder : вы можете указать Kivy непосредственно загружать строку или файл. Если эта строка или файл определяет корневой виджет, он будет возвращен метод:

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

или

Builder.load_string(kv_string

Kv language »Контекст правила

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

0 голосов
/ 29 июня 2018

я постараюсь ответить на ваш вопрос, я действительно не знаю язык 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}

это то, что я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...