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

抱歉,我才编程一个月,有些行话还是没听懂。

4

2 回答 2

2

请试一试。

那里的许多示例代码都大量使用全局变量,例如您的“var”变量。

我已使用您的 var 参数作为指向原始垃圾邮件对象的指针;分配给 MyScale 类中的 self.var_pointer。

下面的代码将更改秤的 ButtonRelease 上的“垃圾邮件”(和“鸡蛋”)的值。

您可以通过键入 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)行正好有两个可用的局部变量:

  • self
  • event

该变量var不是此方法函数的本地变量。也许它在课程或脚本的其他地方使用过,但它不是本地的。

它可能是全球性的,但这是一种不好的做法。

我不确定为什么您会认为var在这种情况下会知道该变量。

于 2009-05-29T23:37:13.937 回答