2017-03-09 4 views
0

私は、スケールとボタンウィジェットを含むGUIを持っています。ボタンをクリックすると、スケールウィジェットを削除する関数が呼び出されます。スケール値が変更された場合、つまり、ボタンコマンドをアクティブにする前にスケールカーソルを移動させたい場合にのみ、これを実行したいと思います。スケールのデフォルト値は0で、人々はカーソルを動かして0に戻ってきます。私は多くのことを試しましたが、簡単な方法でそれを行う方法を理解できませんでした。スケールウィジェットとボタン付きコマンド、スケール値の変更までコマンドを防止する

ありがとうございます!

は、ここに私のコードの簡易版です。@Sunベアにより示唆されるように

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方法を使用して新しいバージョンです。それでも動作しません、 "アクション"関数は更新された状態変数を取得していないようです。

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'に変わりますが、" action "関数は状態変数の更新された値を取得しないようです。新しいバージョンのコードを表示するために私の質問を編集しました。どうぞご覧ください。ありがとうございました! –

+0

@PLdeChantal問題は 'scale_activate'がローカル変数だということです。つまり、3つのscale_activate変数があります.1つはメインコードに、もう1つは各関数にあり、それらは接続されていません。 1つの方法は、グローバル変数にすることです。そうでなければ、変数がメインコードから関数に渡され、メインコードと関数に戻されていることを確認する必要があります。これは非常に不便です。 –

1

破壊する前に値を比較できます。 DoubleVarはスケールのためには役に立ちません。スケールは、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() 
関連する問題