2015-04-16 1 views
-2

У меня есть изумительная функция здесь:Почему моя функция нуждается в аргументе и как его называть + без?

def update_config(val): 
    config = configparser.ConfigParser() 
    fonts_comb = "" 
    for i in range(len(fonts)): 
     if i == len(fonts) - 1: 
      fonts_comb = fonts_comb + fonts[i] 
     else: 
      fonts_comb = fonts_comb + fonts[i] + ", " 
    config["LISTS"] = {"Fonts": fonts_comb} 
    config["variables"] = {"font_size": (screen_font_size.var).get(), 
          "x_offset": (x_offset_spin.var).get(), 
          "y_offset": (y_offset_spin.var).get(), 
          "language": language, 
          "preview_font_size": (preview_font_size_spin.var).get()} 
    variables = config["variables"] 
    if (fonts_menu.var).get() != strings[17]: 
     variables["font"] = (fonts_menu.var).get() 
    else: 
     variables["font"] = font 
    if (preview_fonts.var).get() != strings[18]: 
     variables["preview_font"] = (preview_fonts.var).get() 
    else: 
     variables["preview_font"] = preview_font 
    with open("config.ini", "w") as configfile: 
     config.write(configfile) 

Я не знаю, если это уместно, тоже, но в основном это делает то, что название говорит - обновляет файл конфигурация.
Что мне не нравится в функции, так это то, что для этого требуется аргумент (val здесь, должно быть self?). И потому что это требует этого аргумента, я не могу назвать его «правильно». Позвольте мне продемонстрировать, следующие работы просто отлично:

class OptionMenus(tk.OptionMenu): 
    def __init__(self, master, status, *fonts): 
     self.var = tk.StringVar(master) 
     (self.var).set(status) 
     (tk.OptionMenu).__init__(self, master, self.var, *fonts, 
           command = update_config) 

Однако - вызов, как после возвращения этой ошибки: TypeError: update_config() takes 0 positional arguments but 1 was given

class Spinboxes(tk.Spinbox): 
    def __init__(self, master): 
     self.var = tk.IntVar() 
     tk.Spinbox.__init__(self, master, textvariable = self.var, 
          from_ = 0, to = 100, command = update_config) 

сейчас, я решил его с помощью этого:

def crossover(): 
    val = "" 
    update_config(val) 

Но это похоже на способ обезьянья-то, что-то делать, так есть лучший способ назвать эту функцию?

+0

Дело в том, что 'tk.Spinbox' не передает никаких аргументов команде обратного вызова, а' tk.OptionMenu' передает выбранное значение команде обратного вызова. Поэтому, если вы используете одну и ту же функцию, она должна иметь возможность принимать либо ноль, либо один аргумент. Вы можете сделать это, используя 'def update_config (val = None):' like kindall suggest. – fhdrsdg

ответ

1

Используйте значение аргумента по умолчанию:

def update_config(val=None): 
    # etc. 

Вы также можете удалить аргумент целиком и использовать с одним аргументом lambda назвать его в контексте, где этот аргумент должен быть принят:

def update_config(): 
    # etc. 

# ... 

tk.OptionMenu.__init__(self, master, self.var, *fonts, 
         command=lambda _: update_config()) 

Но я думаю, что первый вариант проще.

0
  1. update_config выглядит как метод экземпляра, так что да, я рекомендую использовать принятую переменную self.
  2. Если ошибка говорит, что она принимает 0 аргументов, но 1 дано, это означает, что именно то, что она говорит. Это означает, что вызов update_config из объекта Spinbox передает ему аргумент. Однако, поскольку он отлично работает с OptionMenus и поэтому работает без аргумента, вам нужно настроить его для обработки необязательного аргумента.

Изменение:

def update_config(val): 

к:

def update_config(self, event=None): 

и что должно решить проблему.

+0

'Spinbox' по-прежнему возвращает ошибку:' TypeError: update_config() отсутствует 1 обязательный позиционный аргумент: 'self'' – makaveli

+0

Ну, это 'update_config' метод экземпляра или что? Было бы неплохо иметь [MCVE] (http://stackoverflow.com/help/mcve). – TigerhawkT3

+0

Я думаю, что это скорее обычный (?) Метод, чем метод экземпляра, но я не очень уверен. Это не внутри класса вообще, если это помогает. – makaveli

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