2013-05-19 3 views
1

Я хочу установить цвета объекта и не хочу создавать 10 функций для каждого цвета. Итак, я просто хочу объявить цвета и создать 10 кнопок и одну функцию. Сообщение об ошибке:Как передать параметр в лямбда-функции в python?

<lambda>() missing 1 required positional argument: 'green' 

Код:

from tkinter import * 

green=["#5bd575","#55c76d"] 
#different colors should follow here 

root=Tk() 
Btn=Button(text="Trigger lambda", command=lambda green: printfunction(green)) 
Btn.pack() 

def printfunction(colorset): 
    print(colorset) 

Это не должно быть лямбда-функции, вопрос только, как я могу назвать printfunction с аргументом, нажав на кнопку?

+0

Я нашел способ, но мне это не совсем удобно: command = self.start_set_color function, которая вызывает функцию для каждого цвета (2 строки), которая вызывает вторую общую функцию «self.set_color» (которая получает цвет как параметр, но еще более одной функции – user2366975

+0

нашел решение, похожее на первую идею с lambda: command = lambda: set_color («зеленый») для зеленой кнопки. лямбда просто нужно вызывать без параметра. чувствуя себя глупо. – user2366975

ответ

2

command вызываемый не принимает любой аргументы. Если вы хотите передать green список в printfunction, просто опустить аргумент лямбда не нужно:

Btn=Button(text="Trigger lambda", command=lambda: printfunction(green)) 

Теперь green внутри лямбда относится к глобальным.

Если все, что вы хотели сделать, это позвонить printfunction с предопределенным аргументом, вы можете использовать functools.partial() function; вы передаете ему функцию, которая должна быть вызвана, плюс любые аргументы, которые необходимо передать, и когда вызывается это возвращаемое значение, оно будет делать именно это; вызвать функцию с аргументами, которые вы указали:

from functools import partial 

Btn=Button(text="Trigger lambda", command=partial(printfunction, green)) 
+1

В качестве альтернативы вы можете использовать 'partial (printfunction, green)' –

+1

@JakubM .: Я боюсь, что объяснение 'functools.partial()' будет слишком концептуальным шагом. –

+1

Однажды он будет оцените ... –

0

Python невероятно динамичный, вы можете изменить классы после их определения или создавать локальные функции. Пример:

class X: 
    # generic print function 
    def print_color(self, color): 
     pass 

# dictionary with colors to support 
COLORS = {'green': ["#5bd575","#55c76d"]} 

# attach various print functions to class X 
for name, value in COLORS.items(): 
    def print_color_x(self, value=value): 
     self.print_color(value) 
    setattr(X, 'print_color_{}'.format(name), print_color_x) 

Примечание Параметр value=value по умолчанию. Это необходимо для привязки значения в каждой итерации. Без него поиск value будет иметь место, когда вызывается функция, давая вам ошибки об отсутствующем глобальном value или выбирает случайный, который, возможно, находит там, но не тот, который вы хотите. Использование functools.partial() может быть более чистым, если это позволяет создавать правильные функции-члены, а не только staticfunctions. Обратите внимание, что пример чистой реализации Python, упомянутый в документации, позволяет создавать функции-члены, поэтому использование этого в качестве замены является опцией.

+1

Теперь вы только немного путаете воды .. –

+0

(: ну, я поддержал ваше решение, потому что это просто и легко, но я бы не пощадил предстоящую Pythonista еще один относительно простой вариант, где вы узнаете немного больше о Python. Следующий шаг: переопределить __getitem__, чтобы генерировать методы цветной печати «на лету». –

+0

hm интересная идея. В каком-то другом мире кода я заметил странное поведение, когда значения были выбраны случайным образом, выглядит так: value = value thing is the way to иди туда. – user2366975

Смежные вопросы