В настоящее время я пишу приложение на Python с графическим интерфейсом tkinter, для которого требуется возможность воспроизведения видео. Для этого я использую библиотеку tkintervideo, однако, когда я пытаюсь воспроизвести видео более одного раза, я получаю сообщение об ошибке: PermissionError: [Errno 13] Разрешение отклонено.
Это это полный код приложения tkinter:
import customtkinter as ctk
import os
from tkintervideo import player
from tkintervideo.tools import Controls
import threading
class previewPage(ctk.CTkScrollableFrame):
def __init__(self, master, title, values, methods, *args, **kwargs):
super().__init__(master, label_text=title, *args, **kwargs)
self.grid_columnconfigure(0, weight=1)
self.values = values
self.checkboxes = []
self.buttons = []
self.str_vars = []
i = 0
for value in self.values:
self.str_vars.append(ctk.StringVar(value="on"))
checkbox = ctk.CTkCheckBox(self, text=value, variable=self.str_vars[-1], onvalue="on", offvalue="off")
checkbox.grid(row=i, column=0, padx=10, pady=(10, 0))
self.checkboxes.append(checkbox)
button = ctk.CTkButton(master=self, text=f"Video {i+1}", command=methods[i], corner_radius=8, height=40, width=100)
button.grid(row=i, column=1, padx = 10, pady=(10, 0), sticky='w')
self.buttons.append(button)
i += 1
def close(self):
for button in self.buttons:
button.grid_forget()
for checkbox in self.checkboxes:
checkbox.grid_forget()
def close(self):
for button in self.buttons:
button.grid_forget()
for checkbox in self.checkboxes:
checkbox.grid_forget()
class App(ctk.CTk):
def __init__(self):
super().__init__()
self.mainframe = ctk.CTkFrame(self)
self.mainframe.pack(fill=ctk.BOTH, expand=1)
self.show_vids()
def create_video_player(self, i):
print(f"Opening Video Page {i}") # TEMP
self.video_frame = ctk.CTkFrame(master=self.mainframe, width=self.winfo_screenwidth(), height=self.winfo_screenheight()-100)
#self.video_player = player.Player(self.video_frame,height=200,width=300)
self.video_player = player.Player(self.video_frame,height=self.winfo_screenheight()-200,width=self.winfo_screenwidth())
self.rowconfigure(0,weight=1)
self.rowconfigure(1,weight=0)
self.columnconfigure(0,weight=1)
self.controls = Controls(parent=self.video_frame,player=self.video_player,return_from_vid_page=self.return_from_vid_page)
self.video_player.bind("",self.controls.update_scale)
#self.video_player.grid(column=0,row=0,sticky=tk.NSEW,padx=5,pady=5)
self.video_player.pack(fill="both")
self.video_player.load(os.path.join(os.getcwd(), self.vids[i]))
#self.controls.grid(column=0,row=1,sticky=tk.NSEW,padx=10,pady=10)
self.controls.pack(fill="both")
self.video_frame.place(anchor=ctk.NW, x=0, y=40)
print(f"Closing Video Page {i}") # TEMP
def open_video_page(self, i):
# Creating video player inside thread
video_player_thread = threading.Thread(target=self.create_video_player, args=(i,))
video_player_thread.start()
def close_video_page(self):
self.video_player.stop()
self.video_player.END = True
self.video_player.pack_forget()
self.controls.pack_forget()
self.video_frame.place_forget()
del self.video_player
del self.controls
def video_button_event(self, i): # TODO: VIEW VIDEO i
def nested_event():
self.hide_vids()
self.open_video_page(i)
return nested_event
def return_from_vid_page(self):
self.close_video_page()
self.show_vids()
def show_vids(self): # (OPEN PREVIEW PAGE)
### EDIT ###
print("SHOWING VIDEOS...") # TEMP
# Getting all files in current directory
files = [f for f in os.listdir(os.getcwd()) if os.path.isfile(os.path.join(os.getcwd(), f))]
print(files)
# Getting all MP4 files
self.vids = [f for f in files if f[0:5] == "video"]
for vid in self.vids:
if vid[-4:len(vid)] != ".mp4":
self.vids[vids.index(vid)] = vid + ".mp4"
# Displaying videos (grid --> pack)
methods = [self.video_button_event(i) for i in range(len(self.vids))]
self.preview_page = previewPage(master=self, title="Select Videos to Upload:", values=self.vids, methods=methods, height=self.winfo_screenheight()-100)
#self.preview_page.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsew")
self.preview_page.pack(fill="both")
print("waiting...")
# Re-initialising wait state
self.wait_state = ctk.IntVar()
# Setting flag
self.displaying_vids = True
# Return video names with corresponding checkbox on
vids_to_upload = ""
for var in self.preview_page.str_vars:
if var.get() == "on":
vids_to_upload = vids_to_upload + vid[self.preview_page.str_vars.index(var)] + ' '
return vids_to_upload
def hide_vids(self): # (CLOSE PREVIEW PAGE)
self.preview_page.close()
self.preview_page.pack_forget()
self.displaying_vids = False
app = App()
app.mainloop()
При этом создается список кнопок, при нажатии которых отображается соответствующее видео, расположенное в той же папке, что и файл Python. Я также отредактировал модуль «tkintervideo» так, что кнопка «возврат» расположена в правом нижнем углу видеоплеера.
Когда я нажимаю на одно из видео, возвращаюсь назад. на исходную страницу, затем попробуйте воспроизвести ее снова, ранее упомянутая ошибка PermissionError: [Errno 13] Разрешение отклонено: 'C:\\Users\\zvirg\\Programs\\Automated Content Creation\\tkintervideo\\cache\\output .wav' отображается. (этот каталог файлов действителен)
В чем причина этой ошибки?
В настоящее время я пишу приложение на Python с графическим интерфейсом tkinter, для которого требуется возможность воспроизведения видео. Для этого я использую библиотеку tkintervideo, однако, когда я пытаюсь воспроизвести видео более одного раза, я получаю сообщение об ошибке: PermissionError: [Errno 13] Разрешение отклонено. Это это полный код приложения tkinter: [code]import customtkinter as ctk import os from tkintervideo import player from tkintervideo.tools import Controls import threading
# Creating video player inside thread video_player_thread = threading.Thread(target=self.create_video_player, args=(i,)) video_player_thread.start()
def close_video_page(self):
self.video_player.stop() self.video_player.END = True self.video_player.pack_forget() self.controls.pack_forget() self.video_frame.place_forget() del self.video_player del self.controls
def video_button_event(self, i): # TODO: VIEW VIDEO i
def nested_event():
self.hide_vids() self.open_video_page(i)
return nested_event
def return_from_vid_page(self):
self.close_video_page() self.show_vids()
def show_vids(self): # (OPEN PREVIEW PAGE)
### EDIT ###
print("SHOWING VIDEOS...") # TEMP
# Getting all files in current directory files = [f for f in os.listdir(os.getcwd()) if os.path.isfile(os.path.join(os.getcwd(), f))]
print(files)
# Getting all MP4 files self.vids = [f for f in files if f[0:5] == "video"] for vid in self.vids: if vid[-4:len(vid)] != ".mp4": self.vids[vids.index(vid)] = vid + ".mp4"
# Displaying videos (grid --> pack) methods = [self.video_button_event(i) for i in range(len(self.vids))] self.preview_page = previewPage(master=self, title="Select Videos to Upload:", values=self.vids, methods=methods, height=self.winfo_screenheight()-100) #self.preview_page.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsew") self.preview_page.pack(fill="both")
print("waiting...")
# Re-initialising wait state self.wait_state = ctk.IntVar()
# Setting flag self.displaying_vids = True
# Return video names with corresponding checkbox on vids_to_upload = "" for var in self.preview_page.str_vars: if var.get() == "on": vids_to_upload = vids_to_upload + vid[self.preview_page.str_vars.index(var)] + ' ' return vids_to_upload
app = App() app.mainloop() [/code] При этом создается список кнопок, при нажатии которых отображается соответствующее видео, расположенное в той же папке, что и файл Python. Я также отредактировал модуль «tkintervideo» так, что кнопка «возврат» расположена в правом нижнем углу видеоплеера. Когда я нажимаю на одно из видео, возвращаюсь назад. на исходную страницу, затем попробуйте воспроизвести ее снова, ранее упомянутая ошибка PermissionError: [Errno 13] Разрешение отклонено: 'C:\\Users\\zvirg\\Programs\\Automated Content Creation\\tkintervideo\\cache\\output .wav' отображается. (этот каталог файлов действителен) В чем причина этой ошибки?
В настоящее время я пишу приложение на Python с графическим интерфейсом tkinter, для которого требуется возможность воспроизведения видео. Для этого я использую библиотеку tkintervideo, однако, когда я пытаюсь воспроизвести видео более одного раза,...
В настоящее время я пишу приложение Python с графическим интерфейсом Tkinter, для которого требуется возможность воспроизведения видео. Для этого я использую библиотеку tkintervideo, однако при попытке воспроизвести видео более одного раза получаю...
В настоящее время я пишу приложение Python с графическим интерфейсом Tkinter, для которого требуется возможность воспроизведения видео. Для этого я использую библиотеку tkintervideo, однако при попытке воспроизвести видео более одного раза получаю...