Была пара проблем с вашим кодом.Как отметил в комментариях Джон Андерсон, в ваших файлах 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()