python - 使用具有着色器效果的过渡效果时出现 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
解决方案
推荐阅读
- angular - 组件在 .scss 文件中找不到变量
- google-api - 如何将谷歌驱动器视频导入同一个 youtube 帐户?
- java - Eclipse - 在类路径中找不到任何 META-INF/persistence.xml 文件
- javascript - 使用 Link 传递道具时 this.props.location 未定义
- node.js - Node JS 批量获取 Redis 密钥
- python - BinarySearch 的这段代码有什么问题?
- javascript - 带有 post 参数的 TCPDF 打开窗口
- python - 检测数据框熊猫的所有列中的值是否为数字并将其删除
- c++ - C++:嵌套的 std::conditionals
- windows - 如何将调用 QueryPerformanceFrequency 的代码移植到 Rust?