Полное приложение работает отлично. Но когда я изменяю эффект перехода экрана со слайда или NO на FadeTransition (и аналогично, который использует эффекты шейдера), я вижу следующую проблему.
Переход на новые экраны происходит без проблем. Но переход на любые предыдущие экраны выдает ошибку о том, что экран не найден Для большей ясности предположим, что у меня есть 3 экрана 1, 2 и 3. FadeTransitions работает с 1 до 2 или с 2 до 3, но никогда не с 2 до 1 или с 3 до 1.
Я публикую сообщение об ошибке ниже.
[INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "example.py", line 1229, in <module>
ShamarApp().run()
File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 855, in run
runTouchApp()
File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 504, in runTouchApp
EventLoop.window.mainloop()
File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 92, in mainloop
self._mainloop()
File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 87, in _mainloop
EventLoop.idle()
File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 339, in idle
Clock.tick()
File "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", line 591, in tick
self._process_events()
File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
File "kivy/_clock.pyx", line 167, in kivy._clock.ClockEvent.tick
File "shamar.py", line 248, in <lambda>
event = Clock.schedule_interval(lambda dt: self.update_time(), 1)
File "shamar.py", line 315, in update_time
self.root.current = 'main'
File "kivy/properties.pyx", line 497, in kivy.properties.Property.__set__
File "kivy/properties.pyx", line 544, in kivy.properties.Property.set
File "kivy/properties.pyx", line 599, in kivy.properties.Property.dispatch
File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy/_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
File "/usr/local/lib/python2.7/dist-packages/kivy/uix/screenmanager.py", line 1039, in on_current
screen = self.get_screen(value)
File "/usr/local/lib/python2.7/dist-packages/kivy/uix/screenmanager.py", line 1065, in get_screen
raise ScreenManagerException('No Screen with name "%s".' % name)
kivy.uix.screenmanager.ScreenManagerException: No Screen with name "main".
------------------
(program exited with code: 1)
Press return to continue
Здесь есть экран с именем 'main', который хорошо работает, когда я удаляю этот эффект перехода. Пожалуйста, помогите.
Я добавляю пример кода ниже для дальнейшего объяснения этого сценария.
screenmanager_test.py
import kivy
kivy.require('1.11.0')
import os
os.environ['KIVY_GL_BACKEND'] = 'gl'
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager, NoTransition,\
FadeTransition
from kivy.clock import Clock
class MainScreen(Screen):
def setName(self,*args):
FirstPopup().open()
class SecondScreen(Screen):
pass
class FirstPopup(Popup):
pass
class MyScreenManager(ScreenManager):
pass
class SmTestApp(App):
def build(self):
sm = MyScreenManager()
sm.transition = FadeTransition()
sm.add_widget(MainScreen(name="main_scr"))
sm.add_widget(SecondScreen(name="second_scr"))
return sm
SmTestApp().run()
smtest.kv
#: kivy 1.11.0
<MainScreen>:
name: 'main_scr'
BoxLayout:
orientation: 'vertical'
padding: 100,100
spacing: 50
Label:
text: 'Welcome to Main Screen'
font_size: 35
Button:
text: 'Options'
font_size: 15
on_release: root.setName(*args)
Button:
text: 'Next Screen'
font_size: 15
on_release: app.root.current = 'second_scr'
<SecondScreen>:
name: 'second_scr'
BoxLayout:
orientation:'vertical'
padding:100,100
spacing:50
Label:
text: 'This is your second screen'
font_size: 35
Button:
text: 'Back'
font_size: 25
on_release: app.root.current = 'main_scr'
<FirstPopup>:
title: 'Options Window'
size_hint: None, None
size: 400,370
BoxLayout:
orientation : 'vertical'
Label:
text : "Checkbox options listed here"
Button:
text: "OK"
on_release: root.dismiss()
И следующее сообщение об ошибке при попытке переключиться со второго экрана на первый.
[INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "screenmanager_test.py", line 34, in <module>
SmTestApp().run()
File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 855, in run
runTouchApp()
File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 504, in runTouchApp
EventLoop.window.mainloop()
File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 92, in mainloop
self._mainloop()
File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 87, in _mainloop
EventLoop.idle()
File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 342, in idle
self.dispatch_input()
File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 327, in dispatch_input
post_dispatch_input(*pop(0))
File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 293, in post_dispatch_input
wid.dispatch('on_touch_up', me)
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/local/lib/python2.7/dist-packages/kivy/uix/behaviors/button.py", line 179, in on_touch_up
self.dispatch('on_release')
File "kivy/_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy/_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
File "/usr/local/lib/python2.7/dist-packages/kivy/lang/builder.py", line 64, in custom_callback
exec(__kvlang__.co_value, idmap)
File "/home/pi/Toller_Rpi/training_prgms/smtest.kv", line 37, in <module>
on_release: app.root.current = 'main_scr'
File "kivy/properties.pyx", line 497, in kivy.properties.Property.__set__
File "kivy/properties.pyx", line 544, in kivy.properties.Property.set
File "kivy/properties.pyx", line 599, in kivy.properties.Property.dispatch
File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy/_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
File "/usr/local/lib/python2.7/dist-packages/kivy/uix/screenmanager.py", line 1039, in on_current
screen = self.get_screen(value)
File "/usr/local/lib/python2.7/dist-packages/kivy/uix/screenmanager.py", line 1065, in get_screen
raise ScreenManagerException('No Screen with name "%s".' % name)
kivy.uix.screenmanager.ScreenManagerException: No Screen with name "main_scr".
------------------
(program exited with code: 1)
Press return to continue