TkInter,slider:如何仅在练习完成时触发事件?

2024-04-28 07:56:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用滑块来更新我的可视化效果,但是每次移动滑块拇指时都会发送updateValue命令,即使对于中间值也是如此。

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

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

如何在交互结束时仅触发一次函数?


Tags: tofrom命令self可视化鼠标按钮tk
2条回答

你不能

相反,您可以使用“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()

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

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

相关问题 更多 >