2017-03-09 39 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()