python Tkinter: передача аргумента функции

Может кто поможет мне с моей проблемой. Я новичок в python и не могу понять, как передать аргумент функции в следующем случае: В отдельном файле (sentiment_analysis) у меня есть словарь и массив объектов:

positiveSentiments = dict() // here are some words related to each of the object
objects = ['Google', 'Apple', 'Motorola']

Мне нужно отобразить положительные эмоции каждого объекта:

def onButtonPosObject(p):
for key in sentiment_analysis.positiveSentiments.keys():
    if key == p:
        text.insert(END, sentiment_analysis.positiveSentiments[key])

submenu = Menu(text, tearoff=0)
for p in sentiment_analysis.objects:
   submenu.add_command(label=p, command = lambda : onButtonPosObject(p), underline=0)
textmenu.add_cascade(label='Display positive sentiments', menu=submenu, underline=0)

Я думаю, что мне нужно передать значение метки (p) в качестве параметра функции onButtonPosObject(), и мне нужно получить список слов из словаря PositiveSentiments для каждого объекта, но я получаю пустое значение, например []. Буду очень благодарен за любые рекомендации!


person Alyona Kovalyova    schedule 23.04.2012    source источник


Ответы (2)


Вам нужно зафиксировать текущее значение p в лямбде:

submenu.add_command(label=p, command = lambda p=p: onButtonPosObject(p), underline=0)
person Bryan Oakley    schedule 24.04.2012

Я предполагаю, что происходит то, что ваш список PositiveSentiments['Motorola'] пуст. Я бы добавил оператор печати в этот цикл «for p in sense_analysis.objects», чтобы увидеть, что происходит. Когда вы используете лямбда-команду в подобном цикле, вы в конечном итоге устанавливаете команду для каждого пункта меню, чтобы передать одно и то же значение для p (это будет окончательное значение p), когда они вызывают onButtonPosObject.

Вам нужно сохранить переменную с именем, локальным для каждой лямбды, и передать его в качестве аргумента (знаю, это выглядит беспорядочно): lambda x=p: onButtonPosObject(x). Попробуйте и посмотрите, что у вас получится.

person DaveTheScientist    schedule 23.04.2012