Kivy App 运行 视频;点击事件不起作用
Kivy App running video; Tap event not working
我正在研究 kivy 框架 (v1.10)。我正在尝试创建一个简单的模块,该模块 运行 循环播放视频并在有人点击屏幕后退出应用程序。注意:我正在为 Raspberry PI 开发此应用程序,我检查了其他(与点击事件相关的)示例,它们工作正常。有一次,我在 kivy 的独立视频应用程序中没有成功,我尝试了一个肮脏的技巧,将视频嵌入到网格布局中,然后将布局的 on_press 事件与 call that exits the application. so that I could capture the event, but didn't helped. 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()
如果不需要控件,请使用kivy.uix.videoplayer.Video
class。另一方面,on_press
不是 App
、GridLayout
或 Video
的有效事件,请使用 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()
我正在研究 kivy 框架 (v1.10)。我正在尝试创建一个简单的模块,该模块 运行 循环播放视频并在有人点击屏幕后退出应用程序。注意:我正在为 Raspberry PI 开发此应用程序,我检查了其他(与点击事件相关的)示例,它们工作正常。有一次,我在 kivy 的独立视频应用程序中没有成功,我尝试了一个肮脏的技巧,将视频嵌入到网格布局中,然后将布局的 on_press 事件与 call that exits the application. so that I could capture the event, but didn't helped. 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()
如果不需要控件,请使用kivy.uix.videoplayer.Video
class。另一方面,on_press
不是 App
、GridLayout
或 Video
的有效事件,请使用 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()