【问题标题】:Kivy App running video; Tap event not workingKivy App运行视频;点击事件不起作用
【发布时间】:2017-07-19 22:55:46
【问题描述】:

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

#!/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()

【问题讨论】:

  • 您要启用视频播放器的控件(播放按钮、停止按钮等)吗?或者您希望应用程序的任何部分被触摸时关闭应用程序?
  • 是的,我希望在应用程序的任何部分被触摸时关闭应用程序并且我不想要按钮(即使上面的代码可能正在显示它们)。

标签: python kivy kivy-language


【解决方案1】:

如果您不需要控件,请使用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()

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2018-06-15
    • 2017-08-22
    • 2012-11-07
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多