1

この種の質問が常に聞かれることは知っていますが、必要な答えに出くわすことができなかったか、理解できなかったのです。

私は次のようなことができるようにしたい:

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 か月しか経っていません。

4

2 に答える 2

2

これを試してみてください。

「var」変数のように、多くのサンプルコードがグローバルを惜しみなく使用しています。

var 引数を使用して、元のスパム オブジェクトへのポインタとして機能させました。MyScale クラス内の self.var_pointer に割り当てられます。

以下のコードは、体重計の ButtonRelease の「spam」(および「eggs」) の値を変更します。

値を確認するには、egg.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)
于 2009-05-30T05:45:14.190 に答える
1

このメソッド関数を見てみましょう

    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)行には、使用可能なローカル変数が 2 つだけあります。

  • self
  • event

変数varは、このメソッド関数に対してローカルではありません。クラスまたはスクリプトの他の場所で使用された可能性がありますが、ここではローカルではありません。

それはおそらくグローバルかもしれませんが、それは悪い習慣です。

varこのコンテキストで変数が既知であると考える理由がわかりません。

于 2009-05-29T23:37:13.937 に答える