2016-06-21 2 views
1

Я пытаюсь написать код для игры с использованием Python и, похоже, не могу получить мои переменные из команды нажатия кнопки в словарные переменные для последующего использования , То, что я пытаюсь сделать, - запустить jingle_add() нажатием кнопки, выполнить некоторые вычисления, обновить дисплеи и вернуть значения деревьев, которые были использованы, и вернуться к соответствующим клавишам словаря. Я могу заставить код работать, если в jingle_add() я вызываю значения словаря напрямую, но я пытаюсь сжать свой код и использовать его в качестве шаблона для нескольких разных типов значений, которые будут сохранены в том же словаре, называя их разными кнопками. Тем не менее, с версией нижеприведенного кода я не могу заставить его запускаться вообще, и никаких очевидных ошибок не дается, только флаг на линии лямбда. Есть ли что-то, что мне не хватает в лямбда-звонке, или что-то, что я пропустил в ответ?Обновление значений в dict на Python внутри кнопки Tkinter

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) 

(Обратите внимание, что add_to_data не принимает круглые скобки при использовании в качестве command аргумента.)

+0

Спасибо, это то, о чем я беспокоился. Есть ли способ сделать это специально из назначения кнопок без необходимости писать второе определение (иначе, не используя лямбда, а что-то еще)? Написание второго определения не поможет на самом деле комбинировать код, который я использую в данный момент, потому что тогда мне придется иметь отдельную функцию 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]) ', а затем do' Button (..., command = lambda: add_to_target (данные, «фанаты», «звон», «стоимость»)). Таким образом, у вас будет только одна функция, и лямбда в каждой кнопке будет указывать действительную цель и клавиши. – Hans

+0

Спасибо! Это даже не то, о чем я мог бы подумать. Я просто добавил его в код, и он отлично работал. –

0

Укажите, откуда вы получаете переменную «стоимость». И попытайтесь напечатать что-то проверить, если его будет в первом цикле:

if fans >= cost: 

Ваш правильный код проверки для значений вашего являются сквозными с.