質問
この種の質問が常に尋ねられることはわかっていますが、必要な答えに出会えなかったか、答えたときに理解できなかったかのどちらかです。
次のようなことができるようにしたいです:
spam = StringVar()
spam.set(aValue)
class MyScale(Scale):
def __init__(self,var,*args,**kwargs):
Scale.__init__(self,*args,**kwargs)
self.bind("<ButtonRelease-1>",self.getValue)
self.set(var.get())
def getValue(self,event):
## spam gets changed to the new value set
## by the user manipulating the scale
var.set(self.get)
eggs = MyScale(spam,*args,**kwargs)
eggs.pack()
もちろん、「NameError:」が返されます。グローバル名「var」が定義されていません。」
getValue に引数を渡せない問題を回避するにはどうすればよいですか?グローバル変数を使用しないように警告されましたが、それが唯一の選択肢ですか?変更したい変数ごとに個別のスケール クラスを設定していますか?目の前にある何かが欠けているような気がする...
編集:これはどういう意味ですか?
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "C:\...\interface.py", line 70, in getValue
var.set(self.get)
NameError: global name 'var' is not defined
申し訳ありませんが、プログラミングを始めてまだ 1 か月しか経っていないため、専門用語の一部がまだ理解できません。
解決
この打撃を与えるしてください。
のコード例の多くはそこに寛大にあなたの「VAR」変数のように、グローバルを使用します。
私は、元のスパムオブジェクトへのポインタとして機能するためにあなたのvar引数を使用していました。 MyScaleクラス内self.var_pointerするために割り当てられます。
のコードは以下の規模のとButtonReleaseに(「卵」と「)スパム」の値を変更します。
あなたは、変更された値を参照してくださいeggs.get()またはspam.get()を入力して値をチェックアウトすることができます。
from Tkinter import *
root = Tk()
aValue = "5"
spam = StringVar()
spam.set(aValue)
class MyScale(Scale):
def __init__(self,var,*args,**kwargs):
self.var_pointer = var
Scale.__init__(self,*args,**kwargs)
self.bind("<ButtonRelease-1>",self.getValue)
self.set(var.get())
def getValue(self,event):
## spam gets changed to the new value set
## by the user manipulating the scale
self.var_pointer.set(self.get())
eggs = MyScale(spam)
eggs.pack(anchor=CENTER)
他のヒント
このメソッド関数を見てみましょう
def getValue(self,event):
## spam gets changed to the new value set
## by the user manipulating the scale
var.set(self.get)
の var.set(self.get)
line には、使用可能なローカル変数が 2 つだけあります。
self
event
変数 var
は、このメソッド関数に対してローカルではありません。おそらくクラスまたはスクリプトの他の場所で使用された可能性がありますが、ここではローカルではありません。
おそらくそれは世界的なものかもしれませんが、それは悪い習慣です。
なぜ変数だと考えるのかわかりません var
この文脈では知られているでしょう。