Проблема python CTk
Сам по себе ползунок двигается как надо, но как только я сам захочу поменять его положение, то начинаются проблемы.
Вот, например, хочу песню перемотать на 2:50
саму песню,
то он перемотает, но ползунок продолжит двигаться так, как-будто ничего и не было.
from tkinter import *
from customtkinter import *
from tkinter.ttk import Scale
from pygame import mixer
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
class MusicPlayer():
def __init__(self, window):
# Задаем переменные
self.music_file = None
self.playing_state = False
# Создаем окно
window.geometry('330x150')
window.resizable(0, 0)
window.title('Music')
# Изображения для кнопок
# self.play_img = ImageTk.PhotoImage(Image.open('play.png').resize((30, 30)))
# self.pause_img = ImageTk.PhotoImage(Image.open('pause.png').resize((30, 30)))
# self.stop_img = ImageTk.PhotoImage(Image.open('stop.png').resize((30, 30)))
# Инициализация Pygame mixer
mixer.init()
# Кнопки
self.Slider = CTkSlider(window, from_=0, to=100, command=self.move_slider, width=300)
self.Slider.set(0)
self.Slider.place(x=10, y=100)
self.Load = CTkButton(window, text='Load', command=self.load, width=50)
self.Play = CTkButton(window, text='Play', command=self.play, width=50)
self.Pause = CTkButton(window, text='Pause', command=self.pause, width=50)
self.Stop = CTkButton(window, text='Stop', command=self.stop, width=50)
# Расположение
self.Load.place(x=10, y=20)
self.Play.place(x=135, y=20)
self.Pause.place(x=260, y=20)
self.Stop.place(x=135, y=60)
# Загрузка файлов
def load(self):
try:
self.music_file = askopenfilename(filetypes=[('Audio Files', '*.wav *.ogg *.mp3')])
if self.music_file:
self.music_length = mixer.Sound(self.music_file).get_length() # Получаем длину музыки
print(f'Сейчас играет: {self.music_file}')
mixer.music.load(self.music_file) # Загрузка музыки при загрузке файла
self.Slider.configure(to=mixer.Sound(self.music_file).get_length()) # Установка длины слайдера
self.Slider.set(0) # Сброс слайдера
except Exception as e:
print(f'Не удалось загрузить файл: {e}')
# Начать играть песню
def play(self):
if self.music_file:
mixer.music.play()
# Начать обновление слайдера
self.update_slider()
# Пауза
def pause(self):
if not self.playing_state:
mixer.music.pause()
self.playing_state = True
else:
mixer.music.unpause()
self.playing_state = False
self.update_slider()
# Остановка
def stop(self):
mixer.music.stop()
# Сброс слайдера
self.Slider.set(0)
def move_slider(self, value):
position = float(value)
# Установка позиции воспроизведения
mixer.music.set_pos(position)
def update_slider(self):
if mixer.music.get_busy():
# Получение текущей позиции в секундах
current_position = mixer.music.get_pos() / 1000
self.Slider.set(current_position)
# Обновление слайдера каждую секунду
self.Slider.after(100, self.update_slider)
# Отрисовка окна
root = CTk()
set_default_color_theme("dark-blue")
set_appearance_mode("dark")
app = MusicPlayer(root)
root.mainloop()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я отметил изменения, которые внес в ваш код, проверьте.
from tkinter import *
from customtkinter import *
from tkinter.ttk import Scale
from pygame import mixer
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
class MusicPlayer():
def __init__(self, window):
self.music_file = None
self.playing_state = False
mixer.init() # Инициализация Pygame mixer
window.geometry('330x150')
window.resizable(0, 0)
window.title('Music')
# self.Slider = CTkSlider(
# ---------> v <------------------------------------------------
self.slider = CTkSlider(
window,
from_=0, to=100, width=300,
command=self.move_slider)
self.slider.set(0)
self.slider.place(x=10, y=100)
self.Load = CTkButton(window, text='Load', command=self.load, width=50)
self.Play = CTkButton(window, text='Play', command=self.play, width=50)
self.Pause = CTkButton(window, text='Pause', command=self.pause, width=50)
self.Stop = CTkButton(window, text='Stop', command=self.stop, width=50)
# Расположение
self.Load.place(x=10, y=20)
self.Play.place(x=135, y=20)
self.Pause.place(x=260, y=20)
self.Stop.place(x=135, y=60)
# Загрузка файлов
def load(self):
try:
self.music_file = askopenfilename(
filetypes=[('Audio Files', '*.wav *.ogg *.mp3')])
if self.music_file:
self.music_length = mixer.Sound(
self.music_file).get_length() # Получаем длину музыки
print(f'Сейчас играет: {self.music_file} / {int(self.music_length)}')
mixer.music.load(self.music_file) # Загрузка музыки при загрузке файла
self.slider.configure( # Установка длины слайдера
to=mixer.Sound(self.music_file).get_length())
self.slider.set(0) # Сброс слайдера
except Exception as e:
print(f'Не удалось загрузить файл: {e}')
# Начать играть песню
def play(self):
if self.music_file:
mixer.music.play()
mixer.music.set_pos(self.slider.get()) # +++
# Начать обновление слайдера
self.update_slider()
def pause(self):
if not self.playing_state:
mixer.music.pause()
self.playing_state = True
else:
mixer.music.set_pos(self.slider.get()) # +++
mixer.music.unpause()
self.playing_state = False
self.update_slider()
def stop(self):
mixer.music.stop()
self.slider.set(0)
def move_slider(self, value):
#? position = float(value)
position = int(value)
# Установка позиции воспроизведения
if mixer.music.get_busy():
mixer.music.set_pos(position)
# print(f'position = {position} -=- {int(self.slider.get())}') #
# self.slider.set(position)
def update_slider(self):
# print(f'update_slider(self): {mixer.music.get_busy()} -=- {self.slider.get()}') #
if mixer.music.get_busy():
# Получение текущей позиции в секундах # !!! +++
# !!! +++
# current_position = mixer.music.get_pos() / 1000
current_position = self.slider.get() + 1 # !!! +++
self.slider.set(current_position)
# Обновление слайдера каждую секунду
# --------------------------> ??? <--------------------------???
# self.Slider.after(100, self.update_slider)
self.slider.after(1000, self.update_slider)
# Отрисовка окна
root = CTk()
set_default_color_theme("dark-blue")
set_appearance_mode("dark")
app = MusicPlayer(root)
root.mainloop()