Python & Kivy: камера и меняющийся экран - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу создать приложение с Kivy на Python, но у меня есть некоторые ошибки, которые я пытался решить много раз, но не могу.

Сначала я хочу открыть экран камеры.На экране мы увидим экран нашей веб-камеры и внизу появятся 2 кнопки (Play и Capture).Пока я нажимаю Play, веб-камера будет включена, и если я нажму кнопку Capture, я хочу сделать снимок.Я построил рабочий код до здесь.

После нажатия кнопки Capture и создания снимка я хочу изменить экран, чтобы перейти ко второму экрану, и он просто покажет простое предложение Hello World на черном фоне.

Вот мойкод, где моя вина?Вы можете это исправить?

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

class CheckScreen(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

Builder.load_string("""
ScreenManagement:
    CheckScreen:

<CameraClick@ScreenManager>:
    orientation: 'vertical'
    Camera:
        id: camera
        resolution: (640, 480)
        play: False
    ToggleButton:
        text: 'Play'
        on_press: camera.play = not camera.play
        size_hint_y: None
        height: '48dp'
    Button:
        text: 'Capture'
        size_hint_y: None
        height: '48dp'
        on_press:
            root.capture()
            root.manager.transition.direction = 'left'
            root.manager.current = 'check'

<CheckScreen>:
    name: "check"
    Button:
        text: "Next Screen"
        font_size: 50
""")

class CameraClick(BoxLayout):

    def capture(self):
        camera = self.ids['camera']
        timestr = time.strftime("%Y%m%d_%H%M%S")
        camera.export_to_png("IMG_{}.png".format(timestr))
        print("Captured")
        return CheckScreen

class TestCamera(App):

    def build(self):
        return CameraClick()


TestCamera().run()

Когда я запускаю этот код, он показывает:

AttributeError: объект 'CameraClick' не имеет атрибута 'manager'

1 Ответ

0 голосов
/ 06 февраля 2019

Была пара проблем с вашим кодом.Как отметил в комментариях Джон Андерсон, в ваших файлах py / kv был один класс, унаследованный от разных классов.У вас также было 2 менеджера экрана - вам нужно только 1. Я считаю, что ваш класс CameraClick действительно должен наследовать только Screen от kivy, а не ScreenManager или BoxLayout.Вы можете определить макет внутри самого класса CameraClick.

Ваша ошибка произошла из-за того, что вы пытались получить атрибут 'manager' вашего класса CameraClick, который вы нигде не определили.Чтобы сослаться на менеджер экрана (который, похоже, это то, что вы пытались сделать), вы должны дать менеджеру экрана «идентификатор» и ссылаться на него таким же образом (как у вас с камерой).

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

ScreenManagement:
    CheckScreen:

Do

ScreenManagement:
    CheckScreen:
        name: "check_screen"
        id: check_screen

Еще одна полезная практика - загрузить код kv в переменную и вернуть его в метод build основного приложения.И так далее.Я немного изменил ваш код и думаю, что теперь он должен делать то, что вы ожидаете.Потратьте время, чтобы рассмотреть его и сравнить с вашим, чтобы вы могли увидеть различия, и дайте мне знать, если это не то, что вы ищете.

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

class CheckScreen(Screen):
    pass

class CameraClickScreen(Screen):
    def capture(self):
        camera = self.ids['camera']
        timestr = time.strftime("%Y%m%d_%H%M%S")
        camera.export_to_png("IMG_{}.png".format(timestr))


GUI = Builder.load_string("""

GridLayout:
    cols: 1
    ScreenManager:
        id: screen_manager
        CameraClickScreen:
            name: "camera_click_screen"
            id: camera_click_screen
        CheckScreen:
            name: "check_screen"
            id: check_screen



<CameraClickScreen>:
    orientation: 'vertical'
    GridLayout:
        cols: 1
        Camera:
            id: camera
            resolution: (640, 480)
            play: False
        ToggleButton:
            text: 'Play'
            on_press: camera.play = not camera.play
            size_hint_y: None
            height: '48dp'
        Button:
            text: 'Capture'
            size_hint_y: None
            height: '48dp'
            on_press:
                root.capture()
                # root refers to <CameraClickScreen>
                # app refers to TestCamera, app.root refers to the GridLayout: at the top
                app.root.ids['screen_manager'].transition.direction = 'left'
                app.root.ids['screen_manager'].current = 'check_screen'

<CheckScreen>:
    Button:
        text: "Next Screen"
        font_size: 50
""")

class TestCamera(App):

    def build(self):
        return GUI


TestCamera().run()
...