窗户被摧毁后不会消失

2024-09-29 19:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python脚本来显示图像、播放音乐,并在触发输入时在raspberry pi上显示视频。当我在做这个项目的时候,我决定在脚本中添加一个摄像头。我玩了不同的网络摄像头流媒体,直到我发现MPlayer似乎有最快的帧速率和最少的资源使用。问题是,MPlayer gui隐藏在我用来显示图像的tkinter窗口后面。我尝试了几种不同的方法来将MPlayer窗口放在前面,并使tkinter窗口消失,但似乎没有任何效果。我的代码是:

import sys
import os
import time
import subprocess
import RPi.GPIO as GPIO
if sys.version_info[0] == 2:
    import Tkinter
    tkinter = Tkinter
else:
    import tkinter
from PIL import Image, ImageTk
import board
import neopixel

x=1
GPIO.setmode(GPIO.BCM)
pixels = neopixel.NeoPixel(board.D10, 38)
pixels.fill((0, 0, 0))
GPIO.setwarnings(False)
GPIO.setup(17,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(27,GPIO.OUT)
GPIO.setup(22,GPIO.OUT)
GPIO.setup(24,GPIO.OUT)
GPIO.setup(25,GPIO.OUT)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(27,GPIO.LOW)
GPIO.output(22,GPIO.LOW)
GPIO.output(24,GPIO.LOW)
GPIO.output(25,GPIO.LOW)

def showPIL(pilImage, exVar = 0):
    try:
        root.withdraw()
        root.destroy()
        root.update()
    except:
        pass
    root = tkinter.Toplevel()
    if x == 1:
        w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    else:
        w, h = 100, 100
    root.overrideredirect(1)
    root.geometry("%dx%d+0+0" % (w, h))
    #root.focus_set()
    root.bind("<Escape>", lambda e: (e.widget.withdraw(), e.widget.quit()))
    canvas = tkinter.Canvas(root,width=w,height=h)
    canvas.pack()
    canvas.configure(background='black')
    imgWidth, imgHeight = pilImage.size
    if imgWidth > w or imgHeight > h:
        ratio = min(w/imgWidth, h/imgHeight)
        imgWidth = int(imgWidth*ratio)
        imgHeight = int(imgHeight*ratio)
        pilImage = pilImage.resize((imgWidth,imgHeight), Image.ANTIALIAS)
    image = ImageTk.PhotoImage(pilImage)
    imagesprite = canvas.create_image(w/2,h/2,image=image)
    root.update()

showPIL(Image.open("Data/blank.png"))
while not GPIO.input(4):
    pass
music = subprocess.Popen(['cvlc', '/home/pi/Desktop/Data/music.mp3'])
showPIL(Image.open("Data/trophy.png"))
time.sleep(1)
GPIO.output(22,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(27,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(18,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(17,GPIO.HIGH)
time.sleep(1)
showPIL(Image.open("Data/poison.png"))
pixels.fill((0, 255, 0))
os.system("pkill tk")
x=0
showPIL(Image.open("Data/blank.png"))
x=1
camera = subprocess.Popen(['mplayer', '-fs', 'tv://'])
os.system("wmctrl -a MPlayer")
time.sleep(8)
camera.kill()
os.system("omxplayer -b '/home/pi/Desktop/Data/movie.mp4'")
showPIL(Image.open("Data/gun.png"))
GPIO.output(24,GPIO.HIGH)
GPIO.output(25,GPIO.HIGH)
while not GPIO.input(23):
    pass
pixels.fill((0, 0, 0))
showPIL(Image.open("Data/dumbell.png"))
time.sleep(1)
showPIL(Image.open("Data/pipe.png"))
time.sleep(1)
showPIL(Image.open("Data/noose.png"))
time.sleep(1)
music.kill()
showPIL(Image.open("Data/blank.png"))
end = subprocess.Popen(['cvlc', '/home/pi/Desktop/Data/end.wav'])
time.sleep(8)
end.kill()

Tags: imageimportoutputdatagpiotimepngtkinter
1条回答
网友
1楼 · 发布于 2024-09-29 19:25:15

好吧,这里有几个关键问题。在

一个巨大的问题是你的try/except语句。在

您的try except将始终执行pass。永远不会有这样一个时刻,你可以destroy()某个东西,然后调用update()。这将始终导致错误,因此pass的except语句将运行。在

接下来是一个问题。因为您从来没有定义tkinter实例或者应该定义什么root,所以您创建了一个顶层窗口,这将导致tkinter实例被打开,但没有变量名可供使用。这里所说的根只在函数的本地定义,因此,每当函数再次被调用时,都没有根的记录,因为据函数所知,它还没有被创建。您需要将根定义为一个global变量,以便进行类似的操作。在

即使这对你有用,也应该有两个问题。一个是显示一个额外的空白窗口,二是当您关闭顶层窗口时,该窗口不会自行关闭。在

接下来,您将尝试在运行tkinter实例的同时使用sleep。如果不使用线程,这些东西是不兼容的,因此您要么需要使用线程,要么最好学习如何使用after()After()是tkinter如何管理定时事件的。在

这里不需要使用Toplevel(),而需要使用Tk()。你应该更新你的窗口,而不是破坏和重建你的图形用户界面。在尝试执行raspberry pi项目之前,您可能应该更多地使用tkinter并了解事件管理器是如何工作的。一旦你掌握了Tkinter GUI及其基于事件的过程,你就可以更容易地完成更复杂的事情。在

相关问题 更多 >

    热门问题