פרויקט GUI פשוט זה ילמד אותך על קבצי מדיה ותכנות חוצה פלטפורמות.

בניית נגן וידאו יכולה לעזור לך ליהנות מהסרטונים האהובים עליך בנושא ובסגנון מותאמים אישית. אתה יכול להפוך את הפעלת הווידאו לחלקה יותר, לעצב את הכפתורים והתפריטים של האפליקציה שלך ולהוסיף כל פונקציונליות שתרצה.

פרויקט זה גם יעניק לך ניסיון מעשי בבניית אפליקציות שולחניות חוצות פלטפורמות, עיבוד מולטימדיה וטיפול באירועים. גלה כיצד אתה יכול ליצור נגן מדיה וידאו באמצעות Tkinter, VLC ומודול תאריך ושעה.

מודול Tkinter, VLC ומודול Datetime

Tkinter מאפשר לך ליצור יישומי שולחן עבודה. הוא מציע מגוון של ווידג'טים כמו לחצנים, תוויות ותיבות טקסט שמקלים על פיתוח יישומים כמו לוח שנה GUI פשוט, מחשבון או א מנהל רשימת מטלות. כדי להתקין את Tkinter, פתח מסוף והפעל:

pip install tkinter

ה python-vlc מודול הוא כריכת Python עבור ספריית נגן המדיה VLC (VideoLAN Client). אתה יכול להשתמש במודול זה כדי ליישם את תכונות של VLC ובנה נגן מדיה מותאם אישית משלך. כדי להתקין VLC, הפעל:

pip install python-vlc

ה תאריך שעה מודול מובנה ב- Python ומספק מחלקות ופונקציות לייצג תאריכים, שעות, מרווחים ואזורים שונים.

instagram viewer

אתה יכול למצוא את קוד המקור של הפרויקט הזה בו מאגר GitHub.

ייבא את המודולים הדרושים. הגדירו מחלקה, MediaPlayerApp. הגדר את שיטת הבנאי וקרא לה כדי לאתחל את חלון היישום הראשי. הגדר את הכותרת, המידות וצבע הרקע של נגן המדיה הווידאו. תתקשר ל initialize_player שיטה.

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

הגדירו שיטה, 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)

תגדיר את לְשַׂחֵק כפתור, ה הַפסָקָה כפתור, ה תפסיק כפתור, ה Fast Forward כפתור, ואת הרצה אחורה לַחְצָן. צור ווידג'ט של סרגל התקדמות וידאו. הגדר את רכיב האב שאתה רוצה למקם אותו, את השיטה לעדכון מיקום הפעלת הסרטון, את צבע הרקע והעובי.

ארגן את כל האלמנטים הללו עם ריפוד מתאים לשני הכיוונים.

 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 שבו תשתמש כדי לחשב את משך הזמן הכולל של הסרטון. אם האפליקציה מנגנת סרטון, קבל את משך הזמן שלו באלפיות שניות והמר אותו ל- HH: MM: SS פוּרמָט. אם אין וידאו מופעל, חזור 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"

הגדירו שיטה, הפעל וידאו. אם סרטון וידאו אינו מופעל, צור אובייקט מדיה חדש באמצעות נתיב הקובץ שנבחר. שייך את המדיה לקנבס שנוצר קודם לכן והתחל את הפעלת הווידאו. עדכן את משחק_וידאו מדינה ל נָכוֹן.

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)

הגדירו שיטה, pause_video. אם התחלת הפעלת וידאו והשהית אותו, התקשר ל- לְשַׂחֵק שיטה לחדש את זה. אחרת, התקשר ל הַפסָקָה שיטה ועדכן את ממשק המשתמש בהתאם בשני המקרים.

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. אם סרטון מופעל, אחזר את משך הזמן הכולל ואת זמן ההשמעה הנוכחי, וחשב את אחוז ההתקדמות. עדכן את סרגל ההתקדמות באמצעות ערך מחושב זה. עצב את השעה הנוכחית ואת משך הזמן הכולל ב- HH: MM: SS פוּרמָט.

תזמן שיטה זו לפעול שוב לאחר 1,000 אלפיות השנייה. זה יוצר לולאה שמעדכנת ברציפות את התקדמות הסרטון ואת תוויות הזמן בזמן שהסרטון מופעל.

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 שיורש מ tk. סוּלָם יישומון. הגדר בנאי שקובע את המצב וההתנהגות הראשוניים של סרגל ההתקדמות. הגדר את ערך תצוגה אפשרות ל שֶׁקֶר כדי להימנע מהצגת הערך הנוכחי.

אתחול ההתקדמות בטווח של 0 עד 100. הגדר את הכיוון, האורך, הפקודה שהיא צריכה להפעיל, ואת ההתאמה האישית לסרגל ההתקדמות. קשר אירוע לסרגל ההתקדמות כך שכאשר אתה לוחץ עליו, הוא מבצע את בלחיצה שיטה.

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)

הגדירו שיטה, בלחיצה. בדוק אם סרגל ההתקדמות אינו מושבת ומחשב את הערך החדש על סמך מיקום הקליק. עדכן את ערך סרגל ההתקדמות בהתאם.

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

צור מופע של ה MediaPlayerApp כיתה, והתקשר ל update_video_progress שיטה. ה mainloop() הפונקציה אומרת לפייתון להפעיל את לולאת האירועים של Tkinter ולהקשיב לאירועים עד שתסגור את החלון.

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

בעת הפעלת התוכנית, צץ נגן המדיה של הווידאו. הוא מכיל את בחר קובץ לחצן, תוויות הזמן, לחצנים לשליטה בהפעלת הווידאו וסרגל התקדמות הווידאו.

כשאתה בוחר סרטון, הוא יופעל אוטומטית מההתחלה, תוך עדכון שעת ההתחלה ומשך תוויות הזמן.

על פגיעה ב הַפסָקָה לחצן, הסרטון מושהה ומשתנה ל- קורות חיים לַחְצָן. בלחיצה על Fast Forward לחצן, הסרטון מדלג קדימה ב-10 שניות.

באופן דומה, על פגיעה ב הרצה אחורה כפתור, הוא חוזר 10 שניות אחורה. בלחיצה על תפסיק לחצן, הפעלת הסרטון נעצרת. אתה יכול לגרור או ללחוץ על כל אזור בסרגל ההתקדמות כדי לעבור לכל חלק של הסרטון ותווית הזמן קורא את הזמן שחלף.

אתה יכול לשפר את נגן המדיה הווידאו הזה על ידי הוספת אפשרות לטעינה והצגת כתוביות. אתה יכול גם לשקול תכונות כמו שינוי יחס הגובה-רוחב, שליטה בעוצמת הקול ויצירת לולאה של חלק מהסרטון.

כדי ליישם את התכונות הללו, אתה יכול לחקור את מודול Pygame. Pygame הוא רב תכליתי, קל לשימוש ומשתלב היטב עם Tkinter. הספרייה מאפשרת התאמה אישית, בעלת תכונות אינטראקטיביות ויכולה לפעול בכל פלטפורמה.