как правильно использовать файлы .kv и .py? — вызов функций из .kv как структурировать .py

Пытаюсь понять киви.

Работа над простым приложением, включающим несколько экранов. В настоящее время я пытаюсь вызвать всплывающее окно с помощью кнопки 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 и / или как я могу создать всплывающее окно с меткой, вводом текста и кнопкой и вызовом с кнопки в нем, будет очень признателен.

См. также:  Явное расщепление массива на указатель

Я считаю, что в моем файле .py есть ошибка, касающаяся структуры. Я попытался переместить def show_popup () в класс SecondWindow, как я видел в примере, но безуспешно.

Нужно ли назначать def (я) каждому окну? или их можно вызвать из-за пределов оконного класса?

Заранее спасибо. Я знаю, что это длинный пост для простой задачи. : /

код запускается, если on_release: root.show_popup () закомментирован   —  person ThomasLYIT    schedule 20.07.2020

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. ThomasLYIT

    Параметр 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 будет ссылаться только на последний Button с этим id.

    Спасибо! Когда я читаю ваш пост, это кажется очевидным …:? Спасибо еще раз. person ThomasLYIT; 20.07.2020

    Любая идея, почему всплывающий контент будет отображаться дважды … т.е. 2 текстовых ввода и 2 кнопки? только по одному экземпляру каждого из них в .kv person ThomasLYIT; 20.07.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: