【问题标题】:Invoke different functions using dictionary values使用字典值调用不同的函数
【发布时间】:2017-04-14 18:13:26
【问题描述】:

我有两个班级:

  • 一个叫做Stock()averageopenaveragehighaveragelowStock()类的方法。
  • 其中一个是AppGUI()Tkinter 文件。

问题:我想在我的StartPage 类中调用Stock() 类中的每个平均方法

Class StartPage():
......
......

    # calculate check boxes button
    self.button_calculate = tk.Button(self, 
    text="Calculate",command=self.average)
    self.button_calculate.pack()
    self.button_calculate.place(x=180, y=300)

    self.Google = Stock()        
    button_dict = {`'Average Open': self.Google.averageopen, 
    'Average High': self.Google.averagehigh, 
    'Average Low': self.Google.averagelow`}

如何调用button_dict 中的值? 什么时候这样做,它返回PY_VAR0 但我只想调用函数本身?

【问题讨论】:

  • 你试过button_dict['Average Open'](arguments)吗?

标签: python tkinter python-3.5


【解决方案1】:

您可以通过访问字典值并像使用任何其他函数一样传入任何参数来调用它:

button_dict['Average Open'](parameter, parameter, ...)

如果它返回PY_VAR0,那与你如何称呼它无关。无论如何调用,该函数都会返回相同的内容。

通常,当您看到PY_VAR0 时,这意味着您正在使用或返回StringVar实例,而您打算使用。 p>

以下代码将打印“PY_VAR0”

foo = tk.StringVar(value="this is foo")
print(foo)

以下将打印“this is foo”:

foo = tk.StringVar(value="this is foo")
print(foo.get())

foo =

【讨论】:

    【解决方案2】:

    您可以使用 eval() 函数来动态调用字典中包含的函数。这是一个简单的例子:

    class Stock(object):
        def averageopen(self):
            return True
    
    s = Stock()
    the_dict = {}
    the_dict.update({'Average Open':s.averageopen})
    
    #see that we're about to execute
    print 's.' + the_dict['Average Open'].__name__ + '()'
    
    #now execute it
    print eval('s.' + the_dict['Average Open'].__name__ + '()')
    

    运行此代码将返回存储在 dict 中的函数引用的值:True

    您可以通过在“()”之间添加参数来将参数连接到字符串中。根据需要进行迭代。

    【讨论】:

    • 为什么要使用eval?这是完全没有必要的。这有点像开车去杂货店,把你的车拆开,装在箱子里运到商店,然后在停车场重新组装。
    • 意识到python中的函数是对象(就像其他所有东西一样)-您不需要构建事物的字符串然后对其进行评估,您只需获取函数对象并通过使用调用它obj()。事实上,您可以通过定义 __call__() 魔术方法让任何对象表现得像函数。
    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2018-02-16
    • 2018-10-28
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多