首页 > 解决方案 > 使用具有着色器效果的过渡效果时出现 Kivy ScreenManager 错误

问题描述

完整的应用程序工作正常。但是,当我将屏幕过渡效果从幻灯片或 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

标签: pythonkivyraspberry-pi3

解决方案


推荐阅读