使用命令缩放窗口小部件和按钮,防止命令直到缩放值更改

时间:2017-03-09 01:55:39

标签: python-3.x tkinter widget command

我有一个包含比例和按钮小部件的GUI。单击该按钮时,它会调用一个函数来删除缩放小部件。我希望只有在比例值发生变化时才会发生这种情况,也就是说,我希望人们在激活按钮命令之前移动比例光标。比例尺上的默认值为0,允许人们移动光标,然后返回0.我尝试了很多东西,但无法弄清楚如何以简单的方式做到这一点。

提前谢谢!

以下是我的代码的简化版本:

from tkinter import *

def action(widget):
    widget.destroy()

window = Tk()

value = DoubleVar()
scale = Scale(window, variable=value, resolution=1)
button = Button(window, command = lambda: action(scale))

scale.pack()
button.pack()

window.mainloop()

这是使用.trace方法的新版本,正如@Sun Bear所建议的那样。它仍然不起作用,“动作”功能似乎没有得到更新的状态变量。

from tkinter import *

def scalestate(*arg):   
    scale_activate = True
    print("scale_activate is", scale_activate)

def action(widget):
    if scale_activate:
        widget.destroy()

window = Tk()

scale_activate = False
print("scale_activate is initially", scale_activate)

value = DoubleVar()
value.trace('w', scalestate)
scale = Scale(window, variable=value, orient=HORIZONTAL)

button = Button(window, command = lambda: action(scale))

scale.pack()
button.pack()
window.mainloop()

2 个答案:

答案 0 :(得分:1)

您可以在销毁前比较这些值。 DoubleVar对Scales没用。由于Scales有一个get()函数

from tkinter import *

def action(widget):
    If widget.get() != original:
        widget.destroy()

window = Tk()

scale = Scale(window, resolution=1)
original  = scale.get()
button = Button(window, command = lambda: action(scale))
scale.pack()
button.pack()
window.mainloop()

答案 1 :(得分:1)

您可以使用.trace方法监控比例值,然后切换状态变量。此后,方法“动作”可用于在决定删除比例小部件之前检查状态变量和比例值。

以下代码根据您的规范执行。如果您认为条件过于详细,可以探索最小化条件粒度的方法。

注意,我更改了您的代码,以更面向对象的方式表达它。它可以更轻松地实现您想要的功能。此外,它是一种非常有用的方法,因为您需要在以后执行更复杂的操作。

import tkinter as tk

class SampleApp(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.scale_activate = False
        self.value = tk.DoubleVar()
        self.value.trace('w', self.scalestate) #add a trace to the scale variable
        self.scale = tk.Scale(parent, variable=self.value, resolution=1)
        self.button = tk.Button(parent,
                                command=lambda:self.action(self.scale))
        self.scale.pack()
        self.button.pack()

    def scalestate(self, *arg):
        # method to toggle scale has been activated
        if self.value.get():
            print('Tracing Scale value: ', self.value.get())
            self.scale_activate=True

    def action(self, widget):
        # method to delete scale widget according to your stated conditions
        if self.value.get():
            if self.scale_activate:
                print('self.value>0, self.scale_activate is True, delete scale')
                widget.destroy()
                self.scale_activate = False
                self.value.set(0.0)
            else:
                print('self.value>0, self.scale_activate is False')
                self.scale_activate = True
        else:
            if self.scale_activate:
                print('self.value==0, self.scale_activate is True, delete scale')
                widget.destroy()
                self.scale_activate = False
                self.value.set(0.0)
            else:
                print('self.value==0, self.scale_activate is False')
                self.scale_activate = False


if __name__ == "__main__":
    window = tk.Tk()
    app = SampleApp(window)
    window.mainloop()