Kivy ile Videoplayer’a İlerleme Çubuğu ekleme

Categories python kivyPosted on
teknopenguen kivy uygulama
0 0 vote
Article Rating

Bu dersimizde videoplayerımıza ilerleme durum çubuğu ekleyeceğiz. Bu durum çubuğu bize videonun ilerleme durumunu gösterecek ve ayrıca onu kullanarak videomuzu sarabileceğiz. Bu durum çubuğunu oluşturmak için slider yapısını kullanacağız.

  1. [code lang = "python"]
  2.  
  3. Slider:
  4.  
  5. id: _ilerleme
  6. max: 1
  7. min: 0
  8. value: 0
  9. pos_hint: {"center_x":0.5 , "center_y":0.5}
  10. size_hint: 1, None
  11.  
  12. [/code]

bu ifade ile sliderımızı boxlayoutumuzun kalan kısmına yani butonların yanına boxlayoutu ortalamış bir şekilde oluşturuyoruz. Max ve min değerleri ile sliderımızın son noktası ve başlangıç noktasının değerlerini belirliyoruz. Value ile de bir başlangıç değeri vermiş olduk. Bu değeri değiştirerek videomuzu nasıl sardığımızı göreceğiz. Gelin kv dosyamızın tüm içeriğine bakalım.

  1. [code lang = "python"]
  2.  
  3. <video_player>:
  4.  
  5. video: _video
  6. ilerleme:_ilerleme
  7.  
  8. Video:
  9.  
  10. id: _video
  11. source: "linustorvalds.mp4"
  12.  
  13. play: True
  14.  
  15. BoxLayout:
  16.  
  17. size_hint: 1,0.05
  18.  
  19. orientation: "horizontal"
  20.  
  21. Button:
  22.  
  23. size: 33,33
  24. size_hint: None,None
  25. background_normal: "play_1.png"
  26. background_down: "play_2.png"
  27. on_press: root.oynat()
  28.  
  29. Button:
  30.  
  31. size: 33,33
  32. size_hint: None,None
  33. background_normal: "pause_1.png"
  34. background_down: "pause_2.png"
  35. on_press: root.duraklat()
  36.  
  37. Button:
  38.  
  39. size: 33,33
  40. size_hint: None,None
  41. background_normal: "stop_1.png"
  42. background_down: "stop_2.png"
  43. on_press: root.durdur()
  44.  
  45. Slider:
  46.  
  47. id: _ilerleme
  48. max: 1
  49. min: 0
  50. value: 0
  51. pos_hint: {"center_x":0.5 , "center_y":0.5}
  52. size_hint: 1, None
  53.  
  54. [/code]

sliderımızın value değerine ulaşmak için ona ilerleme adında bir id verdik. Uygulamamızı bu şekilde çalıştırdığımızda slider istediğimiz yerdedir ama hiçbir fonksiyonu yoktur. İlk yapacağımız iş video ilerledikçe sliderımızın göstergesinin de ilerlemesini sağlamaktır onuda şu şekilde sağlayacağız.

  1. [code lang = "python"]
  2.  
  3. def __init__(self,**kwargs):
  4.  
  5. super(video_player,self).__init__(**kwargs)
  6.  
  7. self.video.bind(position = self.slider)
  8.  
  9. [/code]

video_player sınıfımızın altına şu ifadeleri ekleyerek video_player sınıfı örneklendiğinde

  1. [code lang = "python"]
  2.  
  3. self.video.bind(position = self.slider)
  4.  
  5. [/code]

şu ifadenin çalışmasını sağlıyoruz. Yani videomuzun konumu değiştiğinde self.slider fonksiyonu devreye giriyor. Bu fonksiyonu da şu şekilde belirliyoruz.

  1. [code lang = "python"]
  2.  
  3. def slider(self,ins,val):
  4.  
  5. self.ilerleme.value = float(val) / float(ins.duration)
  6.  
  7. [/code]

bu ifade ile ilerleme çubuğumuzun value değeri video ilerledikçe değişiyor ve durum göstergesi videonun konumuna göre bir yer alıyor. Slider fonksiyonumuz burada 3 parametre alıyor birisi zaten bilmiş olduğumuz self parametresi diğer ikinden ins yüklenen videodur val idse o videonun o andaki pozisyonudur (saniye cinsinden). Biz bu val değerini toplam video süresine (ins.duration) bölerek o konumun 0 – 1 değerleri arasındaki konumunu bulduk.

Yapmamız gereken bir diğer değişiklikte videomuzu ilerle çubuğunun herhangi bir noktasına tıklandığında o noktaya sarılmasını sağlamaktır bunu da daha önceden görmüş olduğumuz şu fonksiyonlarla sağlıyoruz.

 

  1. [code lang = "python"]
  2.  
  3. def on_touch_down(self,touch):
  4.  
  5. if self.ilerleme.collide_point(*touch.pos):
  6.  
  7. self.video.unbind(position = self.slider)
  8.  
  9. super(video_player,self).on_touch_down(touch)
  10.  
  11. def on_touch_up(self,touch):
  12.  
  13. if self.ilerleme.collide_point(*touch.pos):
  14.  
  15. self.video.bind(position = self.slider)
  16.  
  17. self.video.seek(self.ilerleme.value)
  18.  
  19. super(video_player,self).on_touch_up(touch)
  20.  
  21. [/code]

fare ile tıklandığında slider fonksiyonunu unbind etmemiz gerekir. Aksi takdirde durum göstergesi tıkladığımız noktaya anlık olarak gelir ve daha sonra kaldığıyerden devam etmek için videonun o anki pozisyonuna geri döner. Tık hareketini kaldırdığımızda videonun sarılması için seek fonksiyonunu kulladık. Böylece value değeri bizim belirlediğimiz nokta olur ve bu noktayı seek fonksiyonuna gönderdiğimizde videomuz o noktadan oynamaya devam eder.

Burada dikkat edilmesi gereken collide_point ifadeleridir. Bu ifadeleri ekleyerek tıklma ve tıkı kaldırma hareketlerinin slider üzerinde yapılıp yapılmadığını kontrol etmiş olduk. Aksi taktirde video üzerine tıklama eyleminde de bu fonksiyonlar çalışacaktı. 

Ayrıca bu touch fonksiyonlarını super ifadeleri ile nasıl override ettiğimize dikkat edin. İsterseniz py dosyamızın tüm içeriğini yazalım.

  1. [code lang = "python"]
  2.  
  3. from kivy.app import App
  4.  
  5. from kivy.uix.relativelayout import RelativeLayout
  6.  
  7.  
  8. class video_player(RelativeLayout):
  9.  
  10. def __init__(self,**kwargs):
  11.  
  12. super(video_player,self).__init__(**kwargs)
  13.  
  14. self.video.bind(position = self.slider)
  15.  
  16. def slider(self,ins,val):
  17.  
  18. self.ilerleme.value = float(val) / float(ins.duration)
  19.  
  20. def oynat(self):
  21.  
  22. self.video.state = "play"
  23.  
  24. def duraklat(self):
  25.  
  26. self.video.state = "pause"
  27.  
  28. def durdur(self):
  29.  
  30. self.video.state = "stop"
  31.  
  32. def on_touch_down(self,touch):
  33.  
  34. if self.ilerleme.collide_point(*touch.pos):
  35.  
  36. self.video.unbind(position = self.slider)
  37.  
  38. super(video_player,self).on_touch_down(touch)
  39.  
  40. def on_touch_up(self,touch):
  41.  
  42. if self.ilerleme.collide_point(*touch.pos):
  43.  
  44. self.video.bind(position = self.slider)
  45.  
  46. self.video.seek(self.ilerleme.value)
  47.  
  48. super(video_player,self).on_touch_up(touch)
  49.  
  50.  
  51.  
  52.  
  53. class video(App):
  54.  
  55. def build(self):
  56.  
  57. return video_player()
  58.  
  59.  
  60. if __name__ == "__main__":
  61.  
  62. video().run()
  63.  
  64. [/code]

py dosyamızda bu şekilde. Biraz uzun ve karmaşık bir ders olabilir bu yüzden yorumlarla sorularınızı sorabilir youtube kanalımızdan videolu halini izleyebilirsiniz.

guest
0 Yorum
Inline Feedbacks
View all comments