我的程序使用VLC绑定播放视频,同时使用time.sleep
功能等到视频结束后播放下一个视频。它将循环播放,直到用户按下按钮,并且只有在视频完成后才会退出。
我正在使用Threading
处理视频播放,因为time.sleep
控制远离root
窗口,并且需要按钮来停止视频。线程解决了这个问题。
我唯一的问题是视频需要嵌入一个窗口。此窗口充当主程序的叠加层(提供完全不同的功能),并在下面更新某些内容时消除视频中的闪烁(这是将视频直接嵌入root
窗口时。
我知道Threading
无法处理Tkinter
所做的任何GUI内容,所以我试图解决它。它在很大程度上起作用,它就是在线程退出时或之前销毁窗口时我遇到了麻烦。
下面是一些示例代码,它打开一个窗口,然后不断计数并打印结果,直到你告诉它停止(在实际程序中,它在Toplevel
窗口中播放视频)。还有一个按钮可以破坏窗口。如何让Destroy
通过线程(而不是按钮)运行?有可能吗?
from tkinter import *
import os
import threading
import time
root = Tk()
class Player(Frame):
def __init__(self, parent=None, **kw):
self.Playing = 0
def Play(self):
self.x = 0
while self.Playing == 1:
print(self.x)
self.x = self.x + 1
time.sleep(3)
if self.Stopping == 1:
self.Playing = 0
sys.exit()
def Go(self):
if self.Playing == 0:
self.Stopping = 0
self.Playing = 1
self.vidcanvas = Toplevel()
self.vidcanvas.configure(bg='black')
self.vidcanvas.geometry('200x200')
self.th1 = threading.Thread(target=self.Play)
self.th1.start()
def Destroy(self):
self.Stopping = 1
self.vidcanvas.destroy()
def Stop(self):
self.Stopping = 1
ply = Player(root)
go = Button(root, text='Play', width=25, command=ply.Go)
go.grid()
stop = Button(root, text='Stop at End of Count', width=25, command=ply.Stop)
stop.grid()
stop = Button(root, text='Kill Window', width=25, command=ply.Destroy)
stop.grid()
root.mainloop()