Проверьте, нажата ли кнопка Tkinter - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу сделать 2 кнопки (+ и -), которые могут изменять громкость.Но если я хочу увеличить громкость, я бы хотел удерживать кнопку нажатой.Есть идеи, как проверить, нажата ли кнопка пользователем?

def volumeUp():
    currentVolume = m.getvolume()[0]
    volumeSlider.set(currentVolume + 5)

def volumeDown():
    currentVolume = m.getvolume()[0]
    volumeSlider.set(currentVolume - 5)

volumeDownButton = Button(win, text = "-", font = myFont, command =  volumeDown, height = 1, width = 1)
volumeDownButton.pack(side = BOTTOM)

volumeUpButton = Button(win, text = "+", font = myFont, command = volumeUp,   height = 1, width = 1)
volumeUpButton.pack(side = BOTTOM)

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Альтернативой ответа fhdrsdg , который также использует after, будет измерение state значения Button и определение, является ли оно в настоящее время active, для этого мы связываемфункция к Button, которая проверяет state и затем увеличивает значение, если state равно active перед использованием after для повторного вызова функции после небольшой задержки:

from tkinter import *

class App():
    def __init__(self, root):
        self.root = root
        self.button = Button(self.root, text="Increment")

        self.value = 0

        self.button.pack()
        self.button.bind("<Button-1>", lambda x: self.root.after(10, self.increment))

    def increment(self, *args):
        if self.button["state"] == "active":
            self.value += 1
            print(self.value)
            self.root.after(10, self.increment)

root = Tk()
App(root)
root.mainloop()
0 голосов
/ 30 ноября 2018

То, что вы можете сделать, это заставить кнопку «Нажать» запустить функцию, которая изменяет громкость, а затем планирует себя для повторного запуска через определенное время (например, 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...