为什么我的函数需要一个参数以及如何用+来调用它?

时间:2015-04-16 23:46:41

标签: python tkinter arguments

我在这里有一个了不起的功能:

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)

但它似乎是一种做事的猴子方式,所以有更好的方法来调用这个功能吗?

2 个答案:

答案 0 :(得分:1)

使用默认参数值:

def update_config(val=None):
    # etc.

您也可以完全删除参数并使用单参数lambda在必须传递参数的上下文中调用它:

def update_config():
    # etc.

# ...

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

但我认为第一种选择更简单。

答案 1 :(得分:0)

  1. update_config看起来像是一个实例方法,所以是的,我建议使用接受的变量self
  2. 如果错误说它需要0个参数但是给出了1,那就意味着它所说的。这意味着从update_config对象调用Spinbox会将参数传递给它。但是,由于它在OptionMenus下工作正常,因此无需参数即可工作,您需要将其设置为处理可选参数。
  3. 变化:

    def update_config(val):
    

    为:

    def update_config(self, event=None):
    

    这应该解决问题。