Ovaj jednostavan GUI projekt naučit će vas o medijskim datotekama i programiranju na više platformi.
Izgradnja videoplayera može vam pomoći da uživate u svojim omiljenim videozapisima u prilagođenoj temi i stilu. Reprodukciju videozapisa možete učiniti glatkom, dizajnirati gumbe i izbornike svoje aplikacije i dodati bilo koju funkciju koju želite.
Ovaj će vam projekt također pružiti praktično iskustvo u izradi stolnih aplikacija za više platformi, obradi multimedije i rukovanju događajima. Otkrijte kako možete napraviti video media player koristeći Tkinter, VLC i modul datetime.
Tkinter, VLC i modul Datetime
Tkinter vam omogućuje stvaranje desktop aplikacija. Nudi razne widgete kao što su gumbi, oznake i tekstni okviri koji olakšavaju razvoj aplikacija poput jednostavan GUI kalendar, kalkulator ili a upravitelj popisa obaveza. Da biste instalirali Tkinter, otvorite terminal i pokrenite:
pip install tkinter
The python-vlc modul je Python vezanje za VLC (VideoLAN Client) media player biblioteku. Ovaj modul možete koristiti za implementaciju
značajke VLC-a i izgradite vlastiti prilagođeni media player. Da biste instalirali VLC, pokrenite:pip install python-vlc
The Datum vrijeme modul je ugrađen u Python i pruža klase i funkcije za predstavljanje različitih datuma, vremena, intervala i zona.
Izvorni kod ovog projekta možete pronaći u GitHub spremište.
Uvezite potrebne module. Definirajte klasu, MediaPlayerApp. Definirajte metodu konstruktora i pozovite je da inicijalizirate glavni prozor aplikacije. Postavite naslov, dimenzije i boju pozadine video media playera. Nazovite inicijalizirati_player metoda.
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()
Definirajte metodu, inicijalizirati_player. Stvorite instancu VLC media playera za interakciju s njegovim funkcijama. Koristeći ovu instancu, stvorite objekt media playera koji možete koristiti za upravljanje reprodukcijom medija. Inicijalizirati varijablu, trenutna_datoteka za praćenje videa koji se trenutno reproducira. Postavite stanja reprodukcije i pozovite create_widgets metoda.
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()
Definirajte create_widgets metoda. Stvorite widget platna i proslijedite nadređeni element u koji ćete ga postaviti, njegovu boju pozadine, širinu i visinu. Stvoriti Odaberite Datoteka gumb za odabir video datoteke koju želite reproducirati. Postavite nadređeni element, tekst koji bi trebao prikazati, stilove fonta i naredbu koju bi trebao pokrenuti kada kliknete na njega.
Stvorite oznaku za prikaz proteklog vremena i trajanja videozapisa. Postavite nadređeni element, tekst, stilove fonta, boju fonta i boju pozadine. Stvorite okvir za kontrolu video reprodukcije i dajte mu boju pozadine.
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)
Definirajte igra gumb, Pauza gumb, Stop gumb, Fast Forward gumb i Premotati dugme. Stvorite widget trake napretka videa. Postavite nadređeni element u koji ga želite smjestiti, način ažuriranja položaja reprodukcije videozapisa, boju pozadine i debljinu.
Organizirajte sve ove elemente s odgovarajućim podstavama u oba smjera.
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)
Definirajte metodu, odaberite_datoteku. Otvorite dijaloški okvir datoteke za odabir video datoteke .mp4 ili .avi proširenje. Ako odaberete bilo koju datoteku, učitajte njen put i ažurirajte vremensku oznaku njezinim trajanjem. Započnite reprodukciju odabranog videa.
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()
Definirajte metodu, get_duration_str koji ćete koristiti za izračun ukupnog trajanja videa. Ako aplikacija reproducira video, uzmite njegovo trajanje u milisekundama i pretvorite ga u HH: MM: SS format. Ako se video ne reproducira, vratite se 00:00:00 kao zadana vrijednost.
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"
Definirajte metodu, play_video. Ako se video ne reproducira, stvorite novi medijski objekt koristeći odabranu putanju datoteke. Povežite medij s prethodno stvorenim platnom i pokrenite reprodukciju videozapisa. Ažurirajte playing_video navesti da Pravi.
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
Definirajte metodu, brzo_naprijed. Ako se videozapis reproducira, uzmite trenutno proteklo vrijeme i dodajte mu 10 000 milisekundi. Postavite novo vrijeme reprodukcije. Slično, definirajte metodu, premotati to oduzima 10 000 milisekundi.
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)
Definirajte metodu, pauza_video. Ako ste pokrenuli bilo koju reprodukciju videozapisa i pauzirali je, nazovite igra način za nastavak. U suprotnom, nazovite pauza metodu i ažurirajte korisničko sučelje u skladu s tim u oba slučaja.
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")
Definirajte metodu, Stop. Ako se videozapis reproducira, zaustavite ga i poništite oznaku vremena. Definirajte metodu, set_video_position. Ako se video reproducira, dohvatite ukupno trajanje i izračunajte željenu poziciju u milisekundama. Postavite vrijeme reprodukcije videozapisa na izračunatu poziciju.
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)
Definirajte metodu, update_video_progress. Ako se video reproducira, dohvatite ukupno trajanje i trenutno vrijeme reprodukcije te izračunajte postotak napretka. Ažurirajte traku napretka koristeći ovu izračunatu vrijednost. Formatirajte trenutno vrijeme i ukupno trajanje u HH: MM: SS format.
Zakažite ponovno pokretanje ove metode nakon 1000 milisekundi. Ovo stvara petlju koja neprestano ažurira napredovanje videozapisa i oznake vremena dok se videozapis reproducira.
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)
Definirajte klasu, VideoProgressBar koji nasljeđuje od tk. Skala widget. Definirajte konstruktor koji postavlja početno stanje i ponašanje trake napretka. Postavi showvalue opcija za lažno kako biste izbjegli prikaz trenutne vrijednosti.
Inicijalizirajte napredak s rasponom od 0 do 100. Postavite orijentaciju, duljinu, naredbu koju mora pokrenuti i prilagodbu trake napretka. Povežite događaj s trakom napretka tako da, kada kliknete na njega, izvrši na klik metoda.
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)
Definirajte metodu, na klik. Provjerite nije li traka napretka onemogućena i izračunava li novu vrijednost na temelju položaja klika. U skladu s tim ažurirajte vrijednost trake napretka.
defon_click(self, event):
if self.cget("state") == tk.NORMAL:
value = (event.x / self.winfo_width()) * 100
self.set(value)
Stvorite instancu MediaPlayerApp razreda i nazovite update_video_progress metoda. The glavna petlja() funkcija govori Pythonu da pokrene Tkinter petlju događaja i osluškuje događaje dok ne zatvorite prozor.
if __name__ == "__main__":
app = MediaPlayerApp()
app.update_video_progress()
app.mainloop()
Prilikom pokretanja programa iskače video media player. Sadrži Odaberite Datoteka gumb, vremenske oznake, gumbi za upravljanje reprodukcijom videozapisa i traka napretka videozapisa.
Kada odaberete video, automatski će se reproducirati od početka, ažurirajući vrijeme početka i trajanje oznaka vremena.
Pri udaru u Pauza gumb, video se pauzira i mijenja u Nastavi dugme. Pritiskom na Fast Forward gumb, video preskače unaprijed za 10 sekundi.
Slično, pri udaru Premotati gumb, vraća se 10 sekundi unazad. Pritiskom na Stop gumb, video reprodukcija se zaustavlja. Možete povući ili kliknuti bilo koje područje na traci napretka da biste se pomaknuli na bilo koji dio videozapisa, a vremenska oznaka očitava proteklo vrijeme.
Možete poboljšati ovaj video media player dodavanjem opcije za učitavanje i prikaz titlova. Također možete razmotriti značajke kao što su promjena omjera slike, kontrola glasnoće i ponavljanje dijela videozapisa.
Da biste implementirali ove značajke, možete istražiti modul Pygame. Pygame je svestran, jednostavan za korištenje i dobro se integrira s Tkinterom. Knjižnica omogućuje prilagodbu, ima interaktivne značajke i može raditi na bilo kojoj platformi.