Kivy App运行视频;点按活动无效

时间:2017-07-19 13:26:29

标签: python kivy kivy-language

我正在研究kivy框架(v1.10)。我正在尝试创建一个简单的模块,在循环中运行视频,并在有人点击屏幕后退出应用程序。注意:我正在为Raspberry PI开发此应用程序,我检查了其他(点击事件相关)示例,它们工作正常。有一次,我在kivy的独立视频应用程序中失败了,我尝试了将视频嵌入到网格布局中的肮脏技巧,然后将布局的on_press事件与退出应用程序的call绑定。所以我可以抓住这个事件,但没有帮助。 Kivy App documentation提到这是可以实现的,但事实并非如此。 下面是我正在处理的示例代码。 PS:它甚至可以在机器上运行,并且不需要Raspberry PI来执行它。

#!/usr/bin/python3
# -*- coding: <UTF-8> -*-
import kivy
kivy.require('1.10.0')

from os.path import dirname, join
from kivy.app import App
from kivy.uix.videoplayer import Video
from kivy.uix.gridlayout import GridLayout
from kivy.logger import Logger
from kivy.clock import Clock
from kivy.properties import ObjectProperty
from kivy.uix.videoplayer import VideoPlayer

class VideoPlayerApp(App):
    def build(self):
        movie = Movie()
        layout = GridLayout(cols=2)
        layout.add_widget(movie.loadMovie(source='./media/SampleVideo_1280x720_1mb.mp4'))
        self.bind(on_press = self.on_stop)  #Not working :(
        return layout

    def on_stop(self):
        return True

class Movie():
    video = ObjectProperty(None)

    def loadMovie(self, **kwargs):
        filename = './media/SampleVideo_1280x720_1mb.mp4'
        return VideoPlayer(source=filename, state='play', options={'eos': 'loop'})

    def check(self):
        Logger.info("film position:" + str(self.video.position))

if __name__ == '__main__':
    VideoPlayerApp().run()

1 个答案:

答案 0 :(得分:0)

如果您不需要控件,请使用kivy.uix.videoplayer.Video类。另一方面,on_press不是AppGridLayoutVideo的有效事件,使用on_touch_down事件或定义您自己的on_press事件

#!/usr/bin/python3
# -*- coding: <UTF-8> -*-
import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.logger import Logger
from kivy.uix.videoplayer import Video

class Player(Video):
    def __init__(self,  **kwargs):
        super(Player,  self).__init__(**kwargs)
        self.source = './media/SampleVideo_1280x720_1mb.mp4'
        self.state='play'
        self.options={'eos': 'loop'}
        self.bind(on_touch_down = self._stop)

    def check(self):
        Logger.info("film position:" + str(self.position))

    def _stop(self,  *args):
        App.get_running_app().stop()


class VideoPlayerApp(App):
    def build(self):
        return Player()

if __name__ == '__main__':
    VideoPlayerApp().run()