TkInter, слайдер: как вызвать событие только после завершения итерации? - PullRequest
6 голосов
/ 19 октября 2010

Я использую ползунок для обновления своей визуализации, но команда updateValue отправляется каждый раз, когда я перемещаю ползунок, даже для промежуточных значений.

Вместо этого я хочу вызвать его только тогда, когда я отпущу кнопку мыши и взаимодействие завершено.

self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=updateValue)

Как я могу активировать функцию только один раз, когда взаимодействие закончено?

Ответы [ 2 ]

24 голосов
/ 06 июня 2013

Это довольно древний вопрос сейчас, но в случае, если кто-то наткнется на эту конкретную проблему, просто используйте функцию bind () и событие «ButtonRelease-1» следующим образом:

import Tkinter as tk

class App:
    def __init__(self):
        self.root = tk.Tk()

        self.slider = tk.Scale(self.root, from_=0, to=256, 
                               orient="horizontal")
        self.slider.bind("<ButtonRelease-1>", self.updateValue)
        self.slider.pack()
        self.root.mainloop()

    def updateValue(self, event):
        print self.slider.get()

app=App()

Надеюсь, это кому-нибудь поможет!

4 голосов
/ 19 октября 2010

Вы не можете.

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

Другой вариант - не использовать встроенную команду и вместо этого использовать пользовательские привязки. Это может быть много работы, чтобы получить абсолютно правильный, но если вам действительно нужен мелкозернистый контроль, вы можете сделать это. Не забывайте, что с мышью можно взаимодействовать с виджетом, используя клавиатуру.

Вот краткий пример, показывающий, как запланировать работу за полсекунды:

import Tkinter as tk

#create window & frames
class App:
    def __init__(self):
        self.root = tk.Tk()
        self._job = None
        self.slider = tk.Scale(self.root, from_=0, to=256, 
                               orient="horizontal", 
                               command=self.updateValue)
        self.slider.pack()
        self.root.mainloop()

    def updateValue(self, event):
        if self._job:
            self.root.after_cancel(self._job)
        self._job = self.root.after(500, self._do_something)

    def _do_something(self):
        self._job = None
        print "new value:", self.slider.get()

app=App()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...