如何正确使用.kv文件和.py? -从.kv调用函数如何构造.py

时间:2020-07-19 21:26:15

标签: python pycharm kivy kivy-language

试图了解猕猴桃。

在一个涉及几个屏幕的简单应用程序上工作。目前,我正在尝试从...中的on_release按钮调用弹出窗口,但没有成功。 错误:

 Traceback (most recent call last):
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 725, in _apply_rule
     raise AttributeError(key)
 AttributeError: release
 
 During handling of the above exception, another exception occurred:
 
 Traceback (most recent call last):
   File "C:/Users/thoma/PycharmProjects/FacesGUI/main.py", line 36, in <module>
     kv = Builder.load_file("my.kv")
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 405, in load_string
     rule_children=rule_children)
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 657, in _apply_rule
     root=rctx['ids']['root'], rule_children=rule_children)
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\uix\widget.py", line 469, in apply_class_lang_rules
     rule_children=rule_children)
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 538, in apply
     rule_children=rule_children)
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 734, in _apply_rule
     '{}: {}'.format(e.__class__.__name__, e), cause=tb)
 kivy.lang.builder.BuilderException: Parser: File "C:\Users\thoma\PycharmProjects\FacesGUI\my.kv", line 100:
 ...
      98:                    center_x: self.parent.center_x
      99:                    center_y: self.parent.center_y
 >>  100:                    on_release: root.show_popup()
     101:
     102:
 ...
 AttributeError: release
   File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 725, in _apply_rule
     raise AttributeError(key)

我尝试使用root,app,self进行调用,并创建MyMainApp()实例并将其传入。????????

我注意到有些用户建议在.py中使用构建器字符串,而其他用户则建议使用.kv文件进行布局等。

彼此之间的优缺点是什么???虽然我习惯于xml布局和java / kotlin类的逻辑,但是使用.kv有点令人困惑。

my.kv

<P>:
    Label:
        text: "Eneter Name or Type 'skip':"

    TextInput:
        text: ""

    Button:
        text: "Submit"




WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"

    GridLayout:
        cols:2


        Button:
            text:"Live Camera"
            on_press: root.activatecamera()

        Button:
            text:"SD Card"
            on_press: root.sdcard()

        Button:
            text:"Event Images"
            on_press: root.viewEventImages()

        Button:
            text:"Event Faces"
            on_release:
                app.root.current = "eventfaces"
                root.manager.transition.direction = "left"

        Button:
            text:"List Names"
            on_press: root.listknownfaces()

        Button:
            text:"View Log"
            on_press: root.pipeout()

        Button:
            text:"Scan Directory"
            on_press: root.scanDirectory()

        Button:
            text:"Facial Recognition on Image"
            on_press: root.metadataRead()


        Button:
            text:"Label Image"
            on_press: root.metadataRead()



        Button:
            text:"Blur Faces"
            on_press: root.metadataRead()

        Button:
            text: "Metadata"
            on_release:
                app.root.current = "second" if passw.text == "tim" else "main"
                root.manager.transition.direction = "left"

        Button:
            text: "Misc."
            on_release:
                app.root.current = "second" if passw.text == "tim" else "main"
                root.manager.transition.direction = "left"


<SecondWindow>:
    name: "eventfaces"


    GridLayout:
        cols:1
        rows:2

        GridLayout:
            cols:4

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed1.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y
                    on_release: root.show_popup()


            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed2.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y


            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed3.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed4.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y


            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed5.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed6.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y


            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed7.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed8.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed9.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed10.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

            Button:
                id: myButton
                Image:
                    source: "unnamed/unnamed11.jpg"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y



            Button:
                text: "Main Menu"
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "left"

main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup


class P(BoxLayout):
    pass


class MainWindow(Screen):
    pass


class SecondWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


def show_popup():
    show = P()  # Create a new instance of the P class

    popupWindow = Popup(title="Enter Name or Type 'skip': ", content=show, size_hint=(None, None), size=(400, 400))
    # Create the popup window

    popupWindow.open()  # show the popup


kv = Builder.load_file("my.kv")


class MyMainApp(App):
    def build(self):
        return kv


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

如果有人可以指导我是否应该使用Builder字符串处理或.kv,和/或我如何创建带有标签,textinput和button以及从button调用的弹出窗口,将不胜感激。

我认为.py文件有关结构的错误。我曾尝试将def show_popup()移入SecondWindow类,如在示例中看到的那样,但没有成功。

是否需要将def分配给每个窗口?还是可以从窗口类之外调用它们?

先谢谢了。我知道这是一篇很简单的任务的漫长帖子。 :/

1 个答案:

答案 0 :(得分:2)

on_release:不支持Image参数。您需要将其移至Button

        Button:
            id: myButton
            on_release: root.show_popup()
            Image:
                source: "unnamed/unnamed1.jpg"
                center_x: self.parent.center_x
                center_y: self.parent.center_y

此外,请注意,id只能引用一个Widget,因此myButton id将仅引用具有该{{1 }}。