Получить переменную из подкласса в Киви - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь установить текстуру виджета Image, который находится внутри класса Wrapper. Обертка также устанавливается внутри класса OneCamScreen. OneCamScreen также управляет классом ScreenManager, который является root классом для моего приложения. Внутри моей основной программы l oop есть конструкция, которая позволяет отображать видео с камеры. Он работает, создавая переменную текстуры, которая переходит в свойство Image.texture. Я использовал эту конструкцию, чтобы поместить текстурную переменную в свойство Image.texture:

cam1 = ObjectProperty(None)
...    
App.get_running_app().root.cam1.texture = texture

Поскольку я сделал несколько экранов, класс-оболочка перестал быть root, не более. Я попытался сделать эту переменную глобальной, вызывая эту переменную из другого класса, и все это не работает. Кажется, что я могу только вызвать root, self, app, но я не могу вызвать подкласс и получить переменную из него. Что мне делать?

Мой python код:

... 
class MainScreen(Screen):
    pass

class OneCamScreen(Screen):
    pass

class TwoCamScreen(Screen):
    pass 
class ScreenManager(ScreenManager):
    main = ObjectProperty(None)
    onecam = ObjectProperty(None)
    twocam = ObjectProperty(None)
class Wrapper(BoxLayout):
    cam1 = ObjectProperty(None)   
class CamMain(App):
    def build(self):
        self.capture = cv2.VideoCapture(0)
        return ScreenManager()
    def update(self, dt):
        _, frame = self.capture.read()
        texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
        result = cv2.flip(frame, 0)
        texture.blit_buffer(result.tostring(), colorfmt='bgr', bufferfmt='ubyte')
        App.get_running_app().cam1.texture = texture
if __name__ == "__main__":
    CamMain().run()

И мой код .kv:

<ScreenManager>:
    id: manager
    transition: FadeTransition()
    main: main
    onecam: onecam
    twocam: twocam
    MainScreen:
        id: main
        name: 'main'
        manager:manager
    OneCamScreen:
        id: onecam
        name: 'onecam'
        manager:manager
    TwoCamScreen:
        id: twocam
        name: 'twocam'
        manager:manager
<MainScreen>:
    BoxLayout:
        Button:
            on_release: app.root.current ='onecam'
            text:'1 камера'

        Button:
            on_release: app.root.current ='twocam'
            text:'2 камера'
<OneCamScreen>:
    Wrapper
<TwoCamScreen>:
    Label:
        text:'второй экран'


<Wrapper>:
    hue: hue
    saturation: saturation
    value:value
    cam1: cam1
    orientation: 'vertical'
    GridLayout:
        cols:2
        BoxLayout:
            orientation: 'vertical'
            spacing:20
            padding:25
            Image:
                id:cam1
                size: self.texture_size
...

Спасибо за внимание!

...