树莓派的Pi摄像头预览与GUI

2 投票
1 回答
17443 浏览
提问于 2025-04-19 05:59

我刚刚进入“Python世界”,正在为我的孩子们制作一个拍照亭。

我买了一个摄像头,并为它写了一个Python脚本。

这个Python脚本很简单(就像摄像头的例子那样):打开摄像头,显示预览窗口,等待5秒,然后拍照。

到目前为止,这没什么大不了的……

但是当我试图把预览窗口放在tkinter窗口的前面时,结果却不行!我知道不能把摄像头的预览图像放到tkinter的框架里,但我们可以用预览窗口来模拟这个效果。

可是每次我运行程序时,摄像头会显示5秒钟,拍完照后,tkinter才会构建窗口。

我尝试了使用子进程,但没有任何改变,这里是代码(在摄像头文件里):

这是代码:

cam.py:
import picamera
from time import sleep


with picamera.PiCamera() as camera:
        camera.preview_fullscreen=False
        camera.preview_window=(620, 320, 640, 480)

        camera.resolution=(640,480)
        camera.start_preview()
        camera.sharpness = 10
        camera.contrast = 30
        camera.vflip=False
        camera.hflip=False
        camera.exposure_mode = 'auto'

        sleep(10)
        #camera.stop_preview()
        #camera.close()

gui.py:

from Tkinter import *
import RPi.GPIO as GPIO
import Image
from PIL import Image, ImageTk
from subprocess import Popen, PIPE

class Tela(object):
        def __init__(self,master, **kwargs):
                self.master=master
                pad=3
                self.geom='200x200+0+0'
                master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth()-pad,
master.winfo_screenheight()-pad))




        def toggle_geom(self, event):
                geom=self.master.winfo_geometry()
                print(geom,self._geom)
                self.master.geometry(self._geom)
                self._geom=geom

win = Tk()
win.title("test")
app=Tela(win)
frame = Frame(win)


frame.pack()

proc=Popen(["python","cam.py"],stdout=PIPE)
output=proc.communicate()[0]
print output


win.mainloop()

1 个回答

2

丹尼尔!问题出在你gui.py文件中倒数第二行,因为当你使用communicate()这个方法时,它会等待进程结束。所以要么是预览在运行,要么是图形界面在运行。

撰写回答