Я пытаюсь запустить / остановить видеофайл в tkinter на Raspberry Pi, используя python 3.
Мне нужно, чтобы видео запускалось с самого начала каждый раз, когда инфракрасный датчик НИЗКИЙ (сломан) иостановитесь, как только датчик снова станет ВЫСОКИМ.В идеале видео должно быть внутри холста tkinter, чтобы я мог одновременно отображать другие элементы на экране (например, панель загрузки).
Мне удалось запустить все, кроме видео, которое запускаетсякак только датчик обнаружен, но он останавливает все другие процессы (например, полосу загрузки) и не останавливается, когда датчик ВЫСОКИЙ.
здесь приведена упрощенная (и непроверенная) версия кодадля вас вы получите представление об общей структуре (реальный код намного длиннее):
import tkinter as TK
import RPi.GPIO as GPIO
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN)
class App:
def __init__(self, root):
self.root = root
self.root.config(background = 'black', cursor = 'none')
self.background = TK.Canvas(root, width = 1024, height = 600, bg = 'black')
self.background.pack()
self.ext = 0
self.trial = 0
self.infrared()
def infrared(self):
if (GPIO.input(14) == False):
self.makebar()
if (self.ext == 0):
self.runvideo()
else:
os.system("killall omxplayer.bin")
self.ext = 0
self.root.after(16, self.infrared)
def runvideo(self):
os.system("omxplayer /home/pi/Desktop/testvideo.m4v")
def makebar():
self.stimulus_rect = TK.Canvas(root, width = 1024, height = 50, bg= 'white')
if self.ext < 1000
self.ext = self.ext + 10
self.stimulus_rect.create_rectangle(0, 0, self.ext, 50, fill="red")
self.stimulus_rect.place(x=0, y=0, anchor="new")
else:
self.trial = self.trial + 1
self.ext = 0
root = TK.Tk()
App(root)
root.mainloop()
Из того, что я смог найти в Интернете: 1) tkinter может быть связан с opencv для достижения этой цели, ноне похоже, что установка opencv на raspberry pi - простая операция;2) В общем, варианты, включающие «os», как представляется, обречены на неудачу в том, чего я хочу достичь.
Я не мог найти чистый способ сделать это.Моим сценарием мечты было бы загружать на холст видеокадры один за другим и делать это с частотой 60 Гц (частота экрана).Затем я проверил бы датчик на той же частоте и предотвратил бы загрузку следующего кадра, если датчик не сломан.В псевдокоде это будет выглядеть так:
def infrared(self):
if (GPIO.input(14) == False):
self.makebar()
if (self.ext == 0):
self.runvideo()
else:
self.video.stop
self.ext = 0
self.frame = 0
self.root.after(16, self.infrared)
def runvideo(self):
self.frame = self.frame + 1
video.run("testvideo.m4v", self.frame)
Есть идеи, как этого добиться в tkinter на малиновом пи?
спасибо, муравей