То, что вы можете сделать, это заставить кнопку «Нажать» запустить функцию, которая изменяет громкость, а затем планирует себя для повторного запуска через определенное время (например, 100 мс).Затем, когда кнопка отпущена, вы можете отменить запланированное повторение функции, которая изменяет громкость, чтобы разорвать цикл.
Я немного изменил ваш код, чтобы сделать пример:
from tkinter import *
win = Tk()
def volumeUpPress(e=None):
global up_after
currentVolume = volumeSlider.get()
volumeSlider.set(currentVolume + 2)
up_after = win.after(100, volumeUpPress)
def volumeUpRelease(e=None):
global up_after
win.after_cancel(up_after)
def volumeDownPress(e=None):
global down_after
currentVolume = volumeSlider.get()
volumeSlider.set(currentVolume - 2)
down_after = win.after(100, volumeDownPress)
def volumeDownRelease(e=None):
global down_after
win.after_cancel(down_after)
volumeSlider = Scale(win, from_=0, to=100, orient=HORIZONTAL)
volumeSlider.pack()
volumeDownButton = Button(win, text = "-", height = 1, width = 1)
volumeDownButton.pack(side = BOTTOM)
volumeDownButton.bind("<Button-1>", volumeDownPress)
volumeDownButton.bind("<ButtonRelease-1>", volumeDownRelease)
volumeUpButton = Button(win, text = "+", height = 1, width = 1)
volumeUpButton.pack(side = BOTTOM)
volumeUpButton.bind("<Button-1>", volumeUpPress)
volumeUpButton.bind("<ButtonRelease-1>", volumeUpRelease)
win.mainloop()
На что следует обратить внимание:
- Я не использовал
command
для кнопки, поскольку это не дает вам гибкой возможности узнать, когда кнопка будет выпущена.Вместо этого я сделал две привязки, одна для нажатия кнопки, другая для ее отпускания. - Я использую метод
after
, чтобы запланировать новый вызов той же функции через заданное количество миллисекунд,Я сохраняю ссылку на эту запланированную функцию в глобальной переменной, чтобы иметь возможность снова использовать ее в функции освобождения, чтобы отменить ее с помощью after_cancel
.bind
, вызывающей функции с объектом события, тогда как after
вызывает функцию без аргументов, потому что оба вызывают одну и ту же функцию, я сделал так, чтобы функцию можно было вызывать как с аргументом, так и без него (e=None
)