【问题标题】:Properly using .kv Files for Kivy and importing them to your Python script正确使用 Kivy 的 .kv 文件并将它们导入 Python 脚本
【发布时间】:2018-09-12 20:01:03
【问题描述】:

我正在关注tutorials for Kivy,但我无法从 .kv 文件中正确加载属性。出于某种原因,我有时可以通过for kv in listdir(kv_path): Builder.load_file(kv_path+kv) 提取 .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

以下窗口显示!

有谁知道我做错了什么?这些是我对/dev/input/event6的权限

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

非常感谢!

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    根据docs,您有两种可能:

    1.

    按名称约定:

    Kivy 查找与您的 App 类同名的小写 Kv 文件,如果以“App”结尾则减去“App”,例如:

    MyApp -> my.kv

    如果此文件定义了一个 Root Widget,它将附加到 App 的 root 属性并用作应用程序小部件树的基础。

    所以你必须将.kv的名称改为小写,并将类App的名称改为以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()
    

    【讨论】:

    • 你是个天才!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多