Този прост GUI проект ще ви научи на медийни файлове и междуплатформено програмиране.

Изграждането на видео плейър може да ви помогне да се наслаждавате на любимите си видеоклипове в персонализирана тема и стил. Можете да направите възпроизвеждането на видео по-гладко, да проектирате бутоните и менютата на приложението си и да добавите каквато искате функционалност.

Този проект също така ще ви даде практически опит в изграждането на междуплатформени настолни приложения, обработка на мултимедия и обработка на събития. Открийте как можете да направите видео медиен плейър с помощта на Tkinter, VLC и модула datetime.

Модулът Tkinter, VLC и Datetime

Tkinter ви позволява да създавате настолни приложения. Той предлага разнообразие от джаджи като бутони, етикети и текстови полета, които улесняват разработването на приложения като прост GUI календар, калкулатор или a мениджър на списък със задачи. За да инсталирате Tkinter, отворете терминал и стартирайте:

pip install tkinter

The python-vlc модулът е обвързване на Python за библиотеката на медийния плейър VLC (VideoLAN Client). Можете да използвате този модул за внедряване на

instagram viewer
характеристики на VLC и изградете свой собствен персонализиран медиен плейър. За да инсталирате VLC, изпълнете:

pip install python-vlc

The Време за среща модулът е вграден в Python и предоставя класове и функции за представяне на различни дати, часове, интервали и зони.

Можете да намерите изходния код на този проект в него GitHub хранилище.

Импортирайте необходимите модули. Определете клас, MediaPlayerApp. Дефинирайте метода на конструктора и го извикайте, за да инициализирате основния прозорец на приложението. Задайте заглавието, размерите и цвета на фона на видеомедийния плейър. Обадете се на инициализиране_плейър метод.

import tkinter as tk
import vlc
from tkinter import filedialog
from datetime import timedelta

classMediaPlayerApp(tk.Tk):
def__init__(self):
super().__init__()
self.title("Media Player")
self.geometry("800x600")
self.configure(bg="#f0f0f0")
self.initialize_player()

Определете метод, инициализиране_плейър. Създайте екземпляр на медийния плейър VLC, за да взаимодействате с неговите функционалности. Използвайки този екземпляр, създайте обект на медиен плейър, който можете да използвате за управление на възпроизвеждането на мултимедия. Инициализирайте променлива, текущ_файл за да следите текущо възпроизвежданото видео. Задайте състоянията на възпроизвеждане и извикайте create_widgets метод.

definitialize_player(self):
self.instance = vlc.Instance()
self.media_player = self.instance.media_player_new()
self.current_file = None
self.playing_video = False
self.video_paused = False
self.create_widgets()

Определете create_widgets метод. Създайте приспособление за платно и предайте родителския елемент, в който да го поставите, неговия фонов цвят, ширина и височина. Създавам Избери файл бутон, за да изберете видео файла, който искате да възпроизведете. Задайте родителския елемент, текста, който трябва да показва, стиловете на шрифта и командата, която трябва да изпълнява, когато щракнете върху него.

Създайте етикет за показване на изминалото време и продължителността на видеоклипа. Задайте родителския елемент, текста, стиловете на шрифта, цвета на шрифта и цвета на фона. Създайте рамка, за да контролирате възпроизвеждането на видео и му дайте фонов цвят.

defcreate_widgets(self):
self.media_canvas = tk.Canvas(self, bg="black", width=800, height=400)
self.media_canvas.pack(pady=10, fill=tk.BOTH, expand=True)
self.select_file_button = tk.Button(
self,
text="Select File",
font=("Arial", 12, "bold"),
command=self.select_file,
)
self.select_file_button.pack(pady=5)
self.time_label = tk.Label(
self,
text="00:00:00 / 00:00:00",
font=("Arial", 12, "bold"),
fg="#555555",
bg="#f0f0f0",
)
self.time_label.pack(pady=5)
self.control_buttons_frame = tk.Frame(self, bg="#f0f0f0")
self.control_buttons_frame.pack(pady=5)

Определете Играйте бутон, на Пауза бутон, на Спри се бутон, на Превъртане напред бутон и Превъртане назад бутон. Създайте приспособление за лента за прогрес на видеоклипа. Задайте родителския елемент, в който искате да го поставите, метода за актуализиране на позицията за възпроизвеждане на видео, цвета на фона и дебелината.

Организирайте всички тези елементи с подходящи подложки в двете посоки.

 self.play_button = tk.Button(
self.control_buttons_frame,
text="Play",
font=("Arial", 12, "bold"),
bg="#4CAF50",
fg="white",
command=self.play_video,
)
self.play_button.pack(side=tk.LEFT, padx=5, pady=5)
self.pause_button = tk.Button(
self.control_buttons_frame,
text="Pause",
font=("Arial", 12, "bold"),
bg="#FF9800",
fg="white",
command=self.pause_video,
)
self.pause_button.pack(side=tk.LEFT, padx=10, pady=5)
self.stop_button = tk.Button(
self.control_buttons_frame,
text="Stop",
font=("Arial", 12, "bold"),
bg="#F44336",
fg="white",
command=self.stop,
)
self.stop_button.pack(side=tk.LEFT, pady=5)
self.fast_forward_button = tk.Button(
self.control_buttons_frame,
text="Fast Forward",
font=("Arial", 12, "bold"),
bg="#2196F3",
fg="white",
command=self.fast_forward,
)
self.fast_forward_button.pack(side=tk.LEFT, padx=10, pady=5)
self.rewind_button = tk.Button(
self.control_buttons_frame,
text="Rewind",
font=("Arial", 12, "bold"),
bg="#2196F3",
fg="white",
command=self.rewind,
)
self.rewind_button.pack(side=tk.LEFT, pady=5)
self.progress_bar = VideoProgressBar(
self, self.set_video_position, bg="#e0e0e0", highlightthickness=0
)
self.progress_bar.pack(fill=tk.X, padx=10, pady=5)

Определете метод, Избери файл. Отворете диалогов прозорец за файл, за да изберете видео файл .mp4 или .avi разширение. Ако изберете произволен файл, заредете неговия път и актуализирайте етикета за време с неговата продължителност. Започнете възпроизвеждането на избрания видеоклип.

defselect_file(self):
file_path = filedialog.askopenfilename(
filetypes=[("Media Files", "*.mp4 *.avi")]
)
if file_path:
self.current_file = file_path
self.time_label.config(text="00:00:00 / " + self.get_duration_str())
self.play_video()

Определете метод, get_duration_str който ще използвате, за да изчислите общата продължителност на видеоклипа. Ако приложението възпроизвежда видеоклип, вземете продължителността му в милисекунди и го преобразувайте в ЧЧ: ММ: СС формат. Ако не се възпроизвежда видео, върнете се 00:00:00 като стойност по подразбиране.

defget_duration_str(self):
if self.playing_video:
total_duration = self.media_player.get_length()
total_duration_str = str(timedelta(milliseconds=total_duration))[:-3]
return total_duration_str
return"00:00:00"

Определете метод, play_video. Ако видеото не се възпроизвежда, създайте нов медиен обект, като използвате избрания път на файла. Свържете медията със създаденото по-рано платно и започнете възпроизвеждането на видео. Актуализирайте playing_video състояние да Вярно.

defplay_video(self):
ifnot self.playing_video:
media = self.instance.media_new(self.current_file)
self.media_player.set_media(media)
self.media_player.set_hwnd(self.media_canvas.winfo_id())
self.media_player.play()
self.playing_video = True

Определете метод, превъртане напред. Ако се възпроизвежда видеоклип, вземете текущото изминало време и добавете 10 000 милисекунди към него. Задайте новото време за възпроизвеждане. По същия начин дефинирайте метод, превъртане назад което изважда 10 000 милисекунди.

deffast_forward(self):
if self.playing_video:
current_time = self.media_player.get_time() + 10000
self.media_player.set_time(current_time)

defrewind(self):
if self.playing_video:
current_time = self.media_player.get_time() - 10000
self.media_player.set_time(current_time)

Определете метод, пауза_видео. Ако сте започнали възпроизвеждане на видео и сте го поставили на пауза, обадете се на играя метод за възобновяване. В противен случай се обадете на пауза метод и съответно актуализирайте потребителския интерфейс и в двата случая.

defpause_video(self):
if self.playing_video:
if self.video_paused:
self.media_player.play()
self.video_paused = False
self.pause_button.config(text="Pause")
else:
self.media_player.pause()
self.video_paused = True
self.pause_button.config(text="Resume")

Определете метод, Спри се. Ако се възпроизвежда видеоклип, спрете го и нулирайте етикета за време. Определете метод, set_video_position. Ако се възпроизвежда видео, извлечете общата продължителност и изчислете желаната позиция в милисекунди. Задайте времето за възпроизвеждане на видео на изчислената позиция.

defstop(self):
if self.playing_video:
self.media_player.stop()
self.playing_video = False
self.time_label.config(text="00:00:00 / " + self.get_duration_str())

defset_video_position(self, value):
if self.playing_video:
total_duration = self.media_player.get_length()
position = int((float(value) / 100) * total_duration)
self.media_player.set_time(position)

Определете метод, update_video_progress. Ако се възпроизвежда видеоклип, извлечете общата продължителност и текущото време на възпроизвеждане и изчислете процента на напредъка. Актуализирайте лентата за напредъка, като използвате тази изчислена стойност. Форматирайте текущото време и общата продължителност в ЧЧ: ММ: СС формат.

Планирайте този метод да се изпълнява отново след 1000 милисекунди. Това създава цикъл, който непрекъснато актуализира напредъка на видеоклипа и етикетите за време, докато видеоклипът се възпроизвежда.

defupdate_video_progress(self):
ifself.playing_video:
total_duration = self.media_player.get_length()
current_time = self.media_player.get_time()
progress_percentage = (current_time / total_duration) * 100
self.progress_bar.set(progress_percentage)
current_time_str = str(timedelta(milliseconds=current_time))[:-3]
total_duration_str = str(timedelta(milliseconds=total_duration))[:-3]
self.time_label.config(text=f"{current_time_str}/{total_duration_str}")
self.after(1000, self.update_video_progress)

Определете клас, VideoProgressBar който наследява от т.к. Мащаб джаджа. Дефинирайте конструктор, който задава първоначалното състояние и поведение на лентата за напредък. Нагласи showvalue опция за Невярно за да избегнете показването на текущата стойност.

Инициализирайте прогреса с диапазон от 0 до 100. Задайте ориентацията, дължината, командата, която трябва да изпълни, и персонализирането на лентата за напредък. Свържете събитие към лентата за напредъка, така че когато щракнете върху него, то да изпълни on_click метод.

classVideoProgressBar(tk.Scale):
def__init__(self, master, command, **kwargs):
kwargs["showvalue"] = False
super().__init__(
master,
from_=0,
to=100,
orient=tk.HORIZONTAL,
length=800,
command=command,
**kwargs,
)
self.bind("", self.on_click)

Определете метод, on_click. Проверете дали лентата за напредъка не е деактивирана и изчислява новата стойност въз основа на позицията на щракването. Актуализирайте съответно стойността на лентата за напредък.

defon_click(self, event):
if self.cget("state") == tk.NORMAL:
value = (event.x / self.winfo_width()) * 100
self.set(value)

Създайте екземпляр на MediaPlayerApp клас и се обадете на update_video_progress метод. The mainloop() функцията казва на Python да стартира цикъла на събитията на Tkinter и да слуша за събития, докато затворите прозореца.

if __name__ == "__main__":
app = MediaPlayerApp()
app.update_video_progress()
app.mainloop()

При стартиране на програмата се появява видеомедиен плейър. Той съдържа Избери файл бутон, етикетите за време, бутони за управление на възпроизвеждането на видео и лента за прогрес на видеото.

Когато изберете видеоклип, той ще се възпроизведе автоматично от началото, като актуализира началния час и продължителността на етикетите за време.

При удряне на Пауза видеото спира на пауза и се променя на Продължи бутон. При щракване върху Превъртане напред бутон, видеоклипът прескача напред с 10 секунди.

По същия начин, при удряне на Превъртане назад бутон, той се връща с 10 секунди назад. При натискане на Спри се бутон, видео възпроизвеждането спира. Можете да плъзнете или щракнете върху произволна област от лентата за напредък, за да се придвижите до която и да е част от видеоклипа, а етикетът за време прочита изтеклото време.

Можете да подобрите този видеомедиен плейър, като добавите опция за зареждане и показване на субтитри. Можете също така да обмислите функции като промяна на съотношението, контролиране на силата на звука и повторение на част от видеоклипа.

За да приложите тези функции, можете да разгледате модула Pygame. Pygame е многофункционален, лесен за използване и се интегрира добре с Tkinter. Библиотеката позволява персонализиране, има интерактивни функции и може да работи на всяка платформа.