2016-06-21 56 views
1

我正在尝试为使用Python的游戏编写一些代码,似乎不能将我的变量从按钮单击命令中移出到字典变量中供以后使用。我想要做的是在单击按钮上运行jingle_add(),让它运行一些计算,更新显示并返回使用的树值并将其更改回适当的字典键。如果在jingle_add()中直接调用字典值,我可以让代码工作,但我试图压缩我的代码并将其用作多个不同类型值的模板,这些值将保存在同一字典中,用不同的按钮调用它们。但是,在下面的代码版本中,我根本无法运行它,并且没有给出明显的错误,只有lambda行处有一个标志。在lambda调用中是否有某些我错过了,或者是我错过了什么?在Tkinter按钮中更新Python中的字典值

data = {'fans': 0, 'jingle': 0, 'jingle_cost': 15} 

jingle_button = Button(win, text = "Make a jingle - +0.1 fans/sec", command = lambda: data['fans'], data['jingle_cost'], data['jingle'] = jingle_add(data['fans'], data['jingle_cost'], data['jingle'])) 

def jingle_add(fans, cost, building): 
    if fans >= cost: 
     fans -= cost 
     cost = round(cost * (1.07**building), 1) 
     building += 1 
     return fans, cost, building 
+0

如果有人想看到完整的代码,以更好地了解我想要做什么,它可在github.com/kari-fox/MixxMaster –

回答

0

在当前形式下,由于lambda表达式中的赋值,您的代码无法编译。另一种方法是定义做什么的函数,然后使用函数作为回调:

def add_to_data(): 
    data['fans'], data['jingle_cost'], data['jingle'] = jingle_add(data['fans'], data['jingle_cost'], data['jingle']) 

jingle_button = Button(win, 
    text = "Make a jingle - +0.1 fans/sec", command = add_to_data) 

(请注意,由于command参数一起使用时add_to_data不采取括号内。)

+0

谢谢,这就是我所担心的。有没有办法做到这一点,特别是在按钮分配内,而不必写第二个定义(又名,不使用lambda但是其他的)?编写第二个定义对于结合我目前使用的代码并无帮助,因为那么我将不得不为每个用于将它们保存在各自的字典键下的数据类型分别添加add_to_data函数。 –

+0

取决于它需要多普遍,它应该像'def add_to_target(target,k1,k2,k3):target [k1],target [k2],target [k3] = jingle_add(target [k1 ],target [k2],target [k3])',然后做'Button(...,command = lambda:add_to_target(data,“fans”,“jingle”,“cost”))''。这样,你只有一个函数,每个按钮中的lambda将指定实际的目标和键。 – Hans

+0

谢谢!那甚至不是我想到的。我只是将它添加到代码中,它完美地工作。 –

0

请从哪里获得可变'成本'。 并尝试打印一些检查,如果它要在第一循环中:

if fans >= cost: 

您的代码是您与循环值正确的检查。