参考动态确定的类变量(self。[name])

时间:2016-10-29 03:07:50

标签: python tkinter

python的新手,一直在谷歌上搜索。我正在尝试使用简单的计算器进行python类。

目前正在使用tkinter。

        self.grid()
        self.customfont = font.Font(family="Arial", size=14)
        self.entryVariable=tkinter.StringVar()           

        dictFields = {"S0":"Enter initial price, S0, here.",
                      "K":"Enter strike price, K, here.",
                      "T":"Enter time to maturity, T, here.",
                      "r":"Enter risk-free rate, r, here.",
                      "sigma":"Enter volatility, sigma, here.",
                      "q":"Enter dividend yield, q, here."
                      }
        i = 2
        for key in dictFields.keys():
            self.entryVariable = tkinter.StringVar()

            ## Unsure of this but I googled that I can create dynamically named class variables on the fly in this manner - would like to check if this is correct and if it is the best way to do it?
            setattr(self, key, 0) 

            ## another difficulty is that subsequently i have to set the properties of this variables - self.key seems to return be the literal self.key rather than self.S0, self.K etc.  
            self.key = tkinter.Entry(self, textvariable=self.entryVariable, justify="center") 
            self.key.grid(row=i, column=1, sticky="EW")
            self.key.bind("<Return>", self.OnPressEnter)
            self.entryVariable.set(dictFields[key])
            i+=2

任何帮助将不胜感激!

编辑: 我不确定是因为我的问题不清楚(因为它们嵌入在代码中的注释中),或者问题本身通常是不好的。如果有人可以提出建议,我将不胜感激。

问题: 如何动态创建类变量?我搜索了一些涉及setattr(self, key, 0)"{0}".format(key)的方法。但是,我似乎无法让它们工作,因为我试图将tkinter.Entry对象分配给这个动态创建的类变量名。

再次感谢。

1 个答案:

答案 0 :(得分:0)

self很棒,如果你的某些东西可以自称为self

为此,您需要一个课程,这样您就可以将这些变量放在一个地方,并理解您正在构建的这个东西。

怎么样:

class calculator(<you_might_need_another_class_here>):
   """ just a normal calculator """

然后你的下一行将定义你想要如何启动计算器

def __init__(self): #here is where self shows up
    pass
    #replace "pass" with anything calculators do automatically

在此之后,您使用self将在此课程中使用。

是的,您可以使用setattr动态创建属性。确保所有密钥都是字符串。

但最后一个问题是否。你正在访问“self.key”而不是self.S0 所以像

这样的一行
self.key = tkinter.Entry(self, textvariable=self.entryVariable, justify="center") 

可以成为

setattr(self,key,tkinter.Entry(self, textvariable=self.entryVariable, justify="center") 

但老实说,我不知道如何处理这条线。

self.key.grid(row=i, column=1, sticky="EW")

您可以使用getattr(self,key)来拉动动态创建的self.keys