使用屏幕中的操作在其他屏幕中实现事件

时间:2014-02-21 03:46:48

标签: python screen kivy

我正在尝试创建一个包含两个屏幕的kivy应用程序,一个用于确定要检索的视频网址的选择屏幕,以及一个包含将播放所需视频的视频播放器的屏幕。

我想要发生的是让用户点击选择屏幕上的“加载视频”按钮并将视频播放器的状态更改为“播放”,但我不能为我的生活图如何引用视频播放器以实现更改。

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 个答案:

答案 0 :(得分:2)

我看到它的方式,你基本上有两种选择。

如果您只想更改视频播放器的状态,您可以做的是在App级别存储一个属性,然后您可以使用app.my_property或从py文件从kv文件访问该属性使用my_app = App.get_running_app()my_app.my_property。然后,无论何时需要,您都可以查看酒店。

选项二是将视频播放器屏幕设置为每当您切换到该屏幕时开始播放,这会在您按下加载视频时启动视频播放(因为您当前有on_press: root.manager.current = 'videoscr')。为此,您只需为屏幕实施on_enter()(和/或on_pre_enter())方法。