Как вставить временную метку в scalewidget

#python #tkinter

#python #tkinter

Вопрос:

Как я могу сделать это 01:42

введите описание изображения здесь

Я пробовал:

 Scale(a,label='Current',from_='00:00',to='02:00',tickinterval='02:00',resolution='00:01',orient=HORIZONTAL,sliderlength=26,length=300)
  

но это не сработало

Комментарии:

1. Я не думаю, что текст Scale можно изменить

2. @CoolCloud есть ли какой-либо альтернативный виджет, который можно использовать в качестве полосы прокрутки для mp3-плеера

3. Вам придется создать свой собственный, как только что сделал Брайан

Ответ №1:

К сожалению, вы не можете изменить формат отображаемого значения. Вам придется создать свою собственную метку вместо того, чтобы использовать встроенную в виджет. Вы можете сделать это, присоединив команду к виджету и попросив эту команду обновить метку.

Поскольку вы пытаетесь представить время, я рекомендую from to установить для параметров и количество секунд, которое можно легко переформатировать в минуты и секунды.

Вот базовый пример пользовательского класса, который использует фиксированную метку (т. Е. Остается центрированным) и отображает значение в виде минут: секунд.

скриншот

 import tkinter as tk

class CustomScale(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        from_ = kwargs.pop("from_", 0)
        to = kwargs.pop("to", 120)
        orient = kwargs.pop("orient", "vertical")
        super().__init__(*args, **kwargs)

        self.value_label = tk.Label(self, text="00:00")
        self.scale = tk.Scale(
            self, from_=from_, to=to, tickinterval=0,
            command=self.update_label, showvalue=False,
            orient=orient
        )
        self.value_label.pack(side="top", fill="x")
        self.scale.pack(side="bottom", fill="x")

    def update_label(self, value):
        value = int(value)
        minutes = value//60
        seconds = value%60

        self.value_label.configure(text=f"{minutes:02}:{seconds:02}")

root = tk.Tk()
scale = CustomScale(root, from_=0, to=120, orient="horizontal")

scale.pack(side="top", padx=20, pady=20)

root.mainloop()