Skip to main content

Animated video banner for tkinter

Project description

Бібліотека tkbanner підтримує автоматичне визначення параметрів без необхідності явно їх задавати. Якщо певний параметр не передано під час створення VideoBanner, він буде взятий безпосередньо з відеофайлу.

Ця логіка реалізована у banner.py та extractor.py.

FPS

Якщо fps=None, бібліотека:

отримує FPS відео через ffprobe

використовує його для відтворення кадрів і синхронізації аудіо

Delay (затримка між кадрами)

Якщо delay не задано, він автоматично обчислюється з FPS:

delay = 1000 / fps

Якщо FPS недоступний або дорівнює 0 — використовується безпечне значення за замовчуванням (40 мс)

Таким чином, відтворення завжди має коректний таймінг навіть без ручних налаштувань.

Розміри кадру (width / height)

Якщо width або height не задані:

бібліотека визначає реальну ширину та висоту відео через ffprobe

кадри відображаються в оригінальній роздільній здатності

Аудіо параметри

Якщо аудіо увімкнене (music=True):

sample_rate та channels беруться з параметрів конструктора

якщо їх не змінювати, використовуються стандартні значення (44100 Hz, 2 канали)

Загальний принцип

Якщо параметр не переданий явно, tkbanner намагається:

Взяти значення з відеофайлу

Або обчислити його автоматично

Або використати безпечне значення за замовчуванням

Це дозволяє використовувати VideoBanner з мінімальною кількістю аргументів без втрати коректної роботи.

ось приклади

перший приклад:

ads = True def on_banner_click(): global ads if ads: webbrowser.open("https://www.youtube.com/watch?v=xrtwJZ7hrp4&list=RDMMg6SuqTF_SU8&index=27") banner.set_banner(video_path="video/ads_1.mp4") ads = False elif not ads: webbrowser.open("https://www.pygame.org/news") banner.set_banner(video_path="video/ads.mp4") ads = True

banner = VideoBanner( master=root, video_path="video/ads.mp4", # Замініть на шлях до свого відео fps=20, width=400, height=250, music = True, loop=True, lazy_loading=True, on_click=on_banner_click )

banner.place(x = 50,y = 240) banner.start()

Тож я використав свою бібліотеку у власній програмі для показу реклами. Це, звичайно, тестовий код для мене: там не показується реальна реклама, а лише її імітація.

другий приклад:

from tkinter import * from tkbanner import VideoBanner

root = Tk() root.title("🎬 VideoBanner Player Demo") root.state("zoomed") root.configure(bg="#222")

width = root.winfo_screenwidth() height = root.winfo_screenheight()

banner = VideoBanner( master=root, video_path="video/ads_2.mp4", # Замініть на шлях до свого відео width=width, height=height-165, fps=15, loop=False, music=True, lazy_loading = True, one_frame=True, delay=None ) banner.pack()

user_dragging = False # прапорець — користувач тягне повзунок

def toggle_play(): """Старт або стоп.""" if banner.running: banner.stop() btn_play.config(text="⏸") else: banner.start() btn_play.config(text="▶️")

def move_left(): """Перемотка назад на 5 сек.""" mov_left = 5 * banner.fps banner.left(mov_left) update_info()

def move_right(): """Перемотка вперед на 10 сек.""" mov_right = 10 * banner.fps banner.right(mov_right) update_info()

music_not_none = True

def none_music(): global music_not_none if music_not_none: banner.stop_audio() music_not_none = False else: banner.start_audio() music_not_none = True

def update_info(): """Оновлює інфо про кадр і повзунок без втручання у синхронізацію.""" if banner.frames: total = len(banner.frames) if scale_pos.cget("to") != total - 1: scale_pos.config(to=total - 1) val = banner.current_frame_index

    # не рухати повзунок, якщо користувач сам тягне його
    if not user_dragging:
        scale_pos.set(val)        
root.after(100, update_info)  # оновлення рідше, щоб не навантажувати CPU

def on_scale_press(event): """Користувач почав тягнути повзунок.""" global user_dragging user_dragging = True

def on_scale_release(event): """Користувач відпустив повзунок — перемотати до вибраного кадру.""" global user_dragging user_dragging = False val = scale_pos.get() banner.to_switch(int(val))

controls = Frame(root, bg="#222") controls.pack(pady=10)

btn_left = Button(controls, text="⏪", width=10, command=move_left) btn_left.grid(row=0, column=1, padx=10)

btn_play = Button(controls, text="▶️", width=10, command=toggle_play) btn_play.grid(row=0, column=2, padx=10)

btn_right = Button(controls, text="⏩", width=10, command=move_right) btn_right.grid(row=0, column=3, padx=10)

btn_music = Button(controls, text = "🔇", width=5, command = none_music) btn_music.grid(row=0, column=4, padx=10)

scale_pos = Scale( root, from_=1, to=len(banner.frames), orient=HORIZONTAL, length=width-100, bg="#333", fg="white", troughcolor="#555", highlightthickness=0, ) scale_pos.pack()

scale_pos.bind("", on_scale_press) scale_pos.bind("", on_scale_release)

update_info()

root.mainloop()

в цьому коді я створив відео плеєр

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tkbanner-0.1.0.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tkbanner-0.1.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file tkbanner-0.1.0.tar.gz.

File metadata

  • Download URL: tkbanner-0.1.0.tar.gz
  • Upload date:
  • Size: 12.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.0

File hashes

Hashes for tkbanner-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ad279dfcee2fd534d39b2c4b952a75df295bf313312261e054c23b7441726cd3
MD5 71597515f059da2d35727860dc50c9e6
BLAKE2b-256 a256d261431221d751b0cce406060921f99dafdbdb737254dcdd2bb3b0ce730f

See more details on using hashes here.

File details

Details for the file tkbanner-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: tkbanner-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.0

File hashes

Hashes for tkbanner-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 837ce30e3dd01fc4b6f689aadc7526b3d0805263489a34ebb1852e7f1534dfc8
MD5 0ff629390891e71ad0d95098ed1ea7ea
BLAKE2b-256 351c9a14477767f35aae04ea6b3ba43cd820f05117a54d7db34812613d5616ab

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page