TkInter,slider:如何在交互完成时触发事件?

时间:2010-10-19 07:57:37

标签: python tkinter

我正在使用滑块更新我的可视化,但每次移动滑块时都会发送命令updateValue,即使是中间值也是如此。

相反,我只想在释放鼠标按钮并完成交互时触发它。

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

当交互结束时,如何只触发一次该功能?

2 个答案:

答案 0 :(得分:22)

现在这是一个非常古老的问题,但是如果有人偶然发现这个特定问题,只需使用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()

希望这对任何人都有帮助!

答案 1 :(得分:4)

你做不到。

你可以做的是让你的命令使用'after'在短时间内延迟任何实际工作。每次调用命令时,取消所有待处理的工作并重新安排工作。根据您的实际要求,半秒延迟可能就足够了。

另一种选择是不使用内置命令功能,而是使用自定义绑定。这可能需要做很多工作才能完全正确,但如果你真的需要精细控制,你就可以做到。不要忘记除了鼠标之外,还可以使用键盘与窗口小部件进行交互。

这是一个简短的例子,说明如何安排在半秒内完成的工作:

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()