Ta preprost projekt GUI vas bo naučil več o medijskih datotekah in programiranju na več platformah.

Z izdelavo video predvajalnika lahko uživate v svojih najljubših videoposnetkih v prilagojeni temi in slogu. Predvajanje videoposnetkov lahko naredite bolj gladko, oblikujete gumbe in menije svoje aplikacije ter dodate poljubne funkcije.

Ta projekt vam bo dal tudi praktične izkušnje pri gradnji namiznih aplikacij za več platform, obdelavi večpredstavnosti in upravljanju dogodkov. Odkrijte, kako lahko naredite predvajalnik video medijev z uporabo Tkinterja, VLC in modula datetime.

Tkinter, VLC in modul Datetime

Tkinter omogoča ustvarjanje namiznih aplikacij. Ponuja različne pripomočke, kot so gumbi, oznake in besedilna polja, ki olajšajo razvoj aplikacij, kot je preprost GUI koledar, kalkulator ali a upravitelj seznama opravil. Če želite namestiti Tkinter, odprite terminal in zaženite:

pip install tkinter

The python-vlc modul je vezava Python za knjižnico večpredstavnostnih predvajalnikov VLC (VideoLAN Client). Ta modul lahko uporabite za implementacijo

instagram viewer
lastnosti VLC in zgradite svoj lasten multimedijski predvajalnik po meri. Če želite namestiti VLC, zaženite:

pip install python-vlc

The Datum čas modul je vgrajen v Python in ponuja razrede in funkcije za predstavitev različnih datumov, ur, intervalov in območij.

Izvorno kodo tega projekta najdete v Repozitorij GitHub.

Uvozite zahtevane module. Določite razred, MediaPlayerApp. Definirajte metodo konstruktorja in jo pokličite za inicializacijo glavnega okna aplikacije. Nastavite naslov, dimenzije in barvo ozadja video predvajalnika. Pokličite inicializiraj_predvajalnik 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()

Določite metodo, inicializiraj_predvajalnik. Ustvarite primerek medijskega predvajalnika VLC za interakcijo z njegovimi funkcijami. S tem primerkom ustvarite predmet predvajalnika medijev, ki ga lahko uporabite za upravljanje predvajanja predstavnosti. Inicializirajte spremenljivko, trenutna_datoteka za spremljanje trenutno predvajanega videa. Nastavite stanja predvajanja in pokličite 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()

Določite create_widgets metoda. Ustvarite pripomoček za platno in posredujte nadrejeni element, kamor ga želite postaviti, njegovo barvo ozadja, širino in višino. Ustvariti Izberite Datoteka gumb za izbiro video datoteke, ki jo želite predvajati. Nastavite nadrejeni element, besedilo, ki naj se prikaže, sloge pisave in ukaz, ki naj se zažene, ko ga kliknete.

Ustvarite oznako za prikaz pretečenega časa in trajanja videoposnetka. Nastavite nadrejeni element, besedilo, sloge pisave, barvo pisave in barvo ozadja. Ustvarite okvir za nadzor predvajanja videa in mu dajte barvo ozadja.

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)

Določite Igraj gumb, the Pavza gumb, the Stop gumb, the Hitro naprej gumb in Previjanje nazaj gumb. Ustvarite pripomoček vrstice napredka videa. Nastavite nadrejeni element, v katerega ga želite postaviti, način za posodobitev položaja predvajanja videa, barvo ozadja in debelino.

Organizirajte vse te elemente z ustreznim oblazinjenjem v obe smeri.

 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)

Določite metodo, select_file. Odprite pogovorno okno datoteke, da izberete video datoteko .mp4 oz .avi razširitev. Če izberete katero koli datoteko, naložite njeno pot in posodobite časovno oznako z njenim trajanjem. Začnite predvajati izbrani video.

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()

Določite metodo, get_duration_str ki ga boste uporabili za izračun skupnega trajanja videa. Če aplikacija predvaja video, pridobite njegovo trajanje v milisekundah in ga pretvorite v HH: MM: SS format. Če se video ne predvaja, se vrnite 00:00:00 kot privzeto vrednost.

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"

Določite metodo, play_video. Če se videoposnetek ne predvaja, ustvarite nov predstavnostni predmet z uporabo izbrane poti datoteke. Povežite medij s prej ustvarjenim platnom in začnite predvajanje videa. Posodobite playing_video država do Prav.

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

Določite metodo, hitro naprej. Če se videoposnetek predvaja, pridobite trenutni pretečeni čas in mu dodajte 10.000 milisekund. Nastavite nov čas predvajanja. Podobno definirajte metodo, previjanje nazaj ki odšteje 10.000 milisekund.

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)

Določite metodo, pause_video. Če ste začeli s predvajanjem katerega koli videa in ga začasno ustavili, pokličite igrati način za nadaljevanje. V nasprotnem primeru pokličite pavza metodo in v obeh primerih ustrezno posodobite uporabniški vmesnik.

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")

Določite metodo, stop. Če se videoposnetek predvaja, ga ustavite in ponastavite časovno oznako. Določite metodo, set_video_position. Če se videoposnetek predvaja, pridobite skupno trajanje in izračunajte želeni položaj v milisekundah. Nastavite čas predvajanja videa na izračunani položaj.

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)

Določite metodo, update_video_progress. Če se videoposnetek predvaja, pridobite skupno trajanje in trenutni čas predvajanja ter izračunajte odstotek napredka. Posodobite vrstico napredka z uporabo te izračunane vrednosti. Oblikujte trenutni čas in skupno trajanje v HH: MM: SS format.

Načrtujte ponovni zagon te metode po 1000 milisekundah. To ustvari zanko, ki nenehno posodablja napredovanje videa in oznake časa med predvajanjem videa.

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)

Določite razred, VideoProgressBar ki deduje od tk. Lestvica widget. Definirajte konstruktor, ki nastavi začetno stanje in obnašanje vrstice napredka. Nastavite showvalue možnost za False da se izognete prikazu trenutne vrednosti.

Inicializirajte napredek z razponom od 0 do 100. Nastavite usmerjenost, dolžino, ukaz, ki ga mora zagnati, in prilagoditev vrstice napredka. Povežite dogodek z vrstico napredka tako, da ko ga kliknete, izvede on_click 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)

Določite metodo, on_click. Preverite, ali vrstica napredka ni onemogočena in izračuna novo vrednost glede na položaj klika. Ustrezno posodobite vrednost vrstice napredka.

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

Ustvarite primerek MediaPlayerApp razreda in pokličite update_video_progress metoda. The glavna zanka() funkcija pove Pythonu, naj zažene zanko dogodkov Tkinter in posluša dogodke, dokler ne zaprete okna.

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

Ko zaženete program, se prikaže video predvajalnik. Vsebuje Izberite Datoteka gumb, časovne oznake, gumbe za nadzor predvajanja videa in vrstico napredka videa.

Ko izberete video, se bo samodejno predvajal od začetka, pri čemer se bo posodobil začetni čas in trajanje časovnih oznak.

Ob udarcu v Pavza se video začasno ustavi in ​​preklopi na Nadaljuj gumb. Ob kliku na Hitro naprej gumb, video preskoči za 10 sekund naprej.

Podobno pri udarcu v Previjanje nazaj gumb, se vrne za 10 sekund nazaj. Ob pritisku na Stop gumb, se predvajanje videa ustavi. Lahko povlečete ali kliknete katero koli območje v vrstici napredka, da se premaknete na kateri koli del videoposnetka, na časovni oznaki pa je prikazan pretečeni čas.

Ta video predvajalnik lahko izboljšate tako, da dodate možnost nalaganja in prikaza podnapisov. Razmislite lahko tudi o funkcijah, kot je spreminjanje razmerja stranic, nadzor glasnosti in ponavljanje dela videa.

Za implementacijo teh funkcij lahko raziščete modul Pygame. Pygame je vsestranski, enostaven za uporabo in se dobro integrira s Tkinterjem. Knjižnica omogoča prilagajanje, ima interaktivne funkcije in se lahko izvaja na kateri koli platformi.