使用屏幕中的动作来影响其他屏幕中的事件

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())方法。

【讨论】:

非常感谢您的帮助!我选择了选项二,它就像一个魅力。还将对我的问题进行编辑,以向处于类似情况的其他人展示。

以上是关于使用屏幕中的动作来影响其他屏幕中的事件的主要内容,如果未能解决你的问题,请参考以下文章

abap更改标准屏幕文本不影响其他程序

是否有动作来追踪前一个屏幕并使用它来更改另一个屏幕中的某些内容?

Android 修改屏幕亮度方案

Android 修改屏幕亮度

Android 修改屏幕亮度

Android 修改屏幕亮度