我在这里有一个了不起的功能:
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 :(得分: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)
update_config
看起来像是一个实例方法,所以是的,我建议使用接受的变量self
。update_config
对象调用Spinbox
会将参数传递给它。但是,由于它在OptionMenus
下工作正常,因此无需参数即可工作,您需要将其设置为处理可选参数。变化:
def update_config(val):
为:
def update_config(self, event=None):
这应该解决问题。