Объяснение
Если вы добавите функцию print()
до и после presentation = Builder.load_file("kivy.kv")
, до MainApp().run()
и до return presentation
, вы заметите, что метод Builder.load_file () выполняется первым. В этот момент app и MY_NUMBER не существует, и это привело к AttributeError .
Решение
Есть два решения, и они следующие:
- Переместить
presentation = Builder.load_file("kivy.kv")
к методу build()
, то есть непосредственно перед return presentation
или
- Заменить
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}
выход