Правильное использование файлов .kv для Kivy и импорт их в скрипт Python - PullRequest
0 голосов
/ 12 сентября 2018

Я следую учебникам для Kivy , и мне не удалось правильно загрузить свойства из файлов .kv. По какой-то причине я могу иногда извлекать файлы .kv через for kv in listdir(kv_path): Builder.load_file(kv_path+kv), но я не могу сделать это, просто поместив файлы kv в тот же корневой каталог и разрешив ему «импортировать сам?»

Например, при использовании файлов:
main.py

from kivy.app import App  
from kivy.uix.label import Label   
from kivy.uix.widget import Widget  

class Widgets(Widget):
    pass
class SimpleKivy3(App):
    def build(self):
        return Widgets()

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

SimpleKivy3.kv

<Button>:
    font_size: 40
    size: 170,75
    color: 0,1,0,1

<Widgets>:
    Button:
        pos: root.x, root.top - self.height
        text: "Kivy"

    Button:
        pos: 170,0
        text: "Tutorials"

Я получаю следующий вывод на моем терминале:

$ python main.py 
[INFO   ] [Logger      ] Record log in /home/nickshu/.kivy/logs/kivy_18-09-12_58.txt
[INFO   ] [Kivy        ] v1.11.0.dev0, git-038acbf, 20180912
[INFO   ] [Python      ] v3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0]
[INFO   ] [Factory     ] 195 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <gl>
[INFO   ] [GL          ] OpenGL version <b'3.0 Mesa 18.0.5'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel Open Source Technology Center'>
[INFO   ] [GL          ] OpenGL renderer <b'Mesa DRI Intel(R) HD Graphics P630 (Kaby Lake GT2) '>
[INFO   ] [GL          ] OpenGL parsed version: 3, 0
[INFO   ] [GL          ] Shading version <b'1.30'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [ProbeSysfs  ] device match: /dev/input/event6
[INFO   ] [MTD         ] Read event from </dev/input/event6>
[INFO   ] [Base        ] Start application main loop
[INFO   ] [MTD         ] </dev/input/event6> range position X is 1266 - 5676
[INFO   ] [MTD         ] </dev/input/event6> range position Y is 1094 - 4762
[INFO   ] [MTD         ] </dev/input/event6> range touch major is 0 - 0
[INFO   ] [MTD         ] </dev/input/event6> range touch minor is 0 - 0
[INFO   ] [MTD         ] </dev/input/event6> range pressure is 0 - 255
[INFO   ] [MTD         ] </dev/input/event6> axes invertion: X is 0, Y is 0
[INFO   ] [MTD         ] </dev/input/event6> rotation set to 0

Появится следующее окно! enter image description here

Кто-нибудь знает, что я делаю не так? Это мои разрешения для /dev/input/event6

crwxrwxr-- 1 root input 13, 70 Sep 11 23:47 /dev/input/event6

Большое спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Согласно документам у вас есть 2 возможности:

1.

По соглашению имен:

Kivy ищет Kvфайл с тем же именем, что и ваш класс приложения в нижнем регистре, за вычетом «App», если он оканчивается на «App», например:

MyApp -> my.kv

Если этот файл определяет корневой виджетон будет присоединен к корневому атрибуту приложения и будет использоваться в качестве основы дерева виджетов приложения.

Таким образом, вы должны изменить имя .kv на строчные и изменить имя класса App наконец в приложении:

simplekivy3.kv

<Button>:
    font_size: 40
    size: 170,75
    color: 0,1,0,1

<Widgets>:
    Button:
        pos: root.x, root.top - self.height
        text: "Kivy"

    Button:
        pos: 170,0
        text: "Tutorials"

*. py

from kivy.app import App  
from kivy.uix.widget import Widget  

class Widgets(Widget):
    pass

class SimpleKivy3App(App):
    def build(self):
        return Widgets()

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

2.

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

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

from kivy.app import App   
from kivy.uix.widget import Widget  
from kivy.lang import Builder


class Widgets(Widget):
    pass

Builder.load_file('SimpleKivy3.kv')


class SimpleKivy3(App):
    def build(self):
        return Widgets()


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

enter image description here

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