2017-03-09 95 views
0

我有一个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熊的建议。它仍然不起作用,“动作”函数似乎没有得到更新的状态变量。

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

回答

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

你的应用程序工作得很好,这正是我想要的,但我不使用类(但我知道我应该)。 @abccd的解决方案只能部分工作,因为即使在光标移动后我也无法选择原始值;按钮不会启动。我试过对我的应用程序使用'.trace'方法,但它不起作用。当光标移动时,'scale_activate'变量从'False'变为'True',但似乎“动作”函数没有获得状态变量的更新值。我编辑了我的问题以显示我的代码的新版本,您可以查看一下吗?谢谢! –

+0

@PLdeChantal问题是'scale_activate'是一个局部变量。那就是你有3个scale_activate变量,主代码中有1个,每个函数中有1个,它们没有连接。一种方法是使其成为全球变量。否则,您必须确保将变量从主代码传递到函数,并返回到主代码和函数,我认为这样做很不方便。 –

1

您可以比较销毁前的值。而且DoubleVar对于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()