滑块本身按其应有的方式移动,但是一旦我想更改其位置,问题就开始了。
例如,如果我想将一首歌曲快退到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()