2017-07-19 39 views
1

我正在研究kivy框架(v1.10)。我正在嘗試創建一個簡單的模塊,它在循環中運行視頻,並在有人點擊屏幕時退出應用程序。注:我正在開發此應用程序的樹莓派,我檢查了其他(點擊事件相關)的例子,他們只是工作正常。曾經,我在kivy的獨立視頻應用程序中沒有成功,我嘗試了一種將視頻嵌入到網格佈局的骯髒技巧,然後綁定佈局的on_press事件與退出應用程序的call。這樣我才能抓住這個事件,但沒有幫助。 Kivy App documentation提到這是可以實現的,但事實並非如此。 下面是我正在處理的示例代碼。 PS:它甚至可以在機器上運行,並且不需要Raspberry PI來執行它。Kivy App運行視頻;點擊事件不起作用

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

是否要啓用視頻播放器的控件(播放按鈕,停止按鈕等)?或者,您是否希望在應用程序的任何部分被觸摸時關閉該應用程序? – FJSevilla

+0

是的,我希望在應用程序的任何部分被觸摸時關閉應用程序,並且我不需要按鈕(即使上述代碼可能正在顯示它們)。 – w1n5rx

回答

0

如果您不需要控件,請使用kivy.uix.videoplayer.Video類。另一方面,on_press不是App,GridLayoutVideo的有效事件,請使用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()