使用屏幕中的动作来影响其他屏幕中的事件
Posted
技术标签:
【中文标题】使用屏幕中的动作来影响其他屏幕中的事件【英文标题】:Using action in Screen to effect event in other screen 【发布时间】:2014-03-22 09:42:17 【问题描述】:我正在尝试创建一个包含两个屏幕的 kivy 应用程序,一个用于确定要检索的视频 url 的选择屏幕,以及一个包含将播放所需视频的视频播放器的屏幕。
我想要发生的是用户单击选择屏幕上的“加载视频”按钮并将视频播放器的状态更改为“播放”,但我一辈子都做不到了解如何引用视频播放器以执行更改。
Python 文件:
import kivy, datetime,
kivy.require('1.8.0')
from calendar import monthrange
from kivy.app import App
from kivy.properties import ObjectProperty, NumericProperty, ListProperty
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.videoplayer import VideoPlayer
from kivy.uix.spinner import Spinner
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
class SelectionScreen(Screen):
play = ObjectProperty(None)
now = datetime.datetime.now()
videoscreen = ObjectProperty(None)
monthlist = []
for monthnumber in range(1,13):
monthlist.append(str("%02d"%monthnumber))
yearlist = []
for yearnumber in reversed(range(now.year-10,now.year+1)):
yearlist.append(str(yearnumber))
daylist = []
for daynumber in range(1, (monthrange(now.year, now.month)[1]+1)):
daylist.append(str("%02d"%daynumber))
class VideoScreen(Screen):
pass
class RacingReplayApp(App):
def build(self):
sm = ScreenManager(transition=NoTransition())
sm.add_widget(SelectionScreen(name='selectionscr'))
sm.add_widget(VideoScreen(name='videoscr'))
return sm
if __name__ == '__main__':
RacingReplayApp().run()
KV 文件:
<SelectionScreen>:
FloatLayout:
size: root.size
pos: root.pos
canvas.before:
Color:
rgb: 1, .2, .3
Rectangle:
pos: self.pos
size: self.size
Spinner:
id: day_spinner
text: 'Day'
values: root.daylist
size_hint: (None, None)
pos_hint: 'center_x': .35, 'center_y': .75
Spinner:
id: month_spinner
text: 'Month'
values: root.monthlist
size_hint: (None, None)
pos_hint: 'center_x': .5, 'center_y': .75
Spinner:
id: year_spinner
text: 'Year'
values: root.yearlist
size_hint: (None, None)
pos_hint: 'center_x': .65, 'center_y': .75
Button:
id: play
text: 'Load Video'
font_size: 16
size_hint: (.2, .1)
pos_hint: 'center_x': .5, 'center_y': .5
on_press: root.manager.current = 'videoscr'
<VideoScreen>:
FloatLayout:
size: root.size
pos: root.pos
Video:
id: videostream
source: 'URL_GOES_HERE'
fullscreen: True
state: 'stop'
非常感谢任何和所有建议。
编辑:
正如 sirpercival 在下面指出的那样,每个屏幕都有一个附加的“on_enter”方法。我所做的只是将以下内容添加到 kv 文件中:
<VideoScreen>:
on_enter: videostream.state = 'play'
FloatLayout:
现在当点击“加载视频”按钮时,应用将进入视频屏幕并触发 on_enter 方法,导致视频开始播放。
【问题讨论】:
【参考方案1】:在我看来,你基本上有两种选择。
如果您只想更改视频播放器的状态,您可以在 App 级别存储一个属性,然后您可以使用 app.my_property
从 kv 文件访问该属性,或者使用 @ 从 py 文件访问该属性987654322@ 和my_app.my_property
。然后,当您需要时,您只需检查该属性即可。
选项二是将视频播放器屏幕设置为在您切换到该屏幕时开始播放,这将在您按下加载视频时开始播放视频(因为您当前有on_press: root.manager.current = 'videoscr'
)。为此,您只需为您的屏幕实现一个on_enter()
(和/或on_pre_enter()
)方法。
【讨论】:
非常感谢您的帮助!我选择了选项二,它就像一个魅力。还将对我的问题进行编辑,以向处于类似情况的其他人展示。以上是关于使用屏幕中的动作来影响其他屏幕中的事件的主要内容,如果未能解决你的问题,请参考以下文章