python - 如何使用循环来减少python中的代码
问题描述
我想在 tkinter 中创建很多小部件。我目前为此使用了很多代码。有没有办法总结代码?但是,我仍然希望能够捕获每个小部件的价值。编号上升到 200... 非常感谢!
'''
self.A1_rubbing_marks_Type = tk.StringVar(self.A_Frame_measure)
# Dictionary with options
self.A1_choice_rubbing_marks= ['No', 'Yes']
self.A1_rubbing_marks_Type.set('') # set the default option
self.A1_Menu_rubbing_marks = tk.OptionMenu(self.A_Frame_measure, self.A1_rubbing_marks_Type, *self.A1_choice_rubbing_marks, command=self.show_rubbing_marks_borders)
self.A1_Menu_rubbing_marks.config(width=4)
self.A1_Menu_rubbing_marks.grid_forget()
self.A2_rubbing_marks_Type = tk.StringVar(self.A_Frame_measure)
# Dictionary with options
self.A2_choice_rubbing_marks= ['No', 'Yes']
self.A2_rubbing_marks_Type.set('') # set the default option
self.A2_Menu_rubbing_marks = tk.OptionMenu(self.A_Frame_measure, self.A2_rubbing_marks_Type, *self.A2_choice_rubbing_marks, command=self.show_rubbing_marks_borders)
self.A2_Menu_rubbing_marks.config(width=4)
self.A2_Menu_rubbing_marks.grid_forget()
self.A3_rubbing_marks_Type = tk.StringVar(self.A_Frame_measure)
# Dictionary with options
self.A3_choice_rubbing_marks= ['No', 'Yes']
self.A3_rubbing_marks_Type.set('') # set the default option
self.A3_Menu_rubbing_marks = tk.OptionMenu(self.A_Frame_measure, self.A3_rubbing_marks_Type, *self.A3_choice_rubbing_marks, command=self.show_rubbing_marks_borders)
self.A3_Menu_rubbing_marks.config(width=4)
self.A3_Menu_rubbing_marks.grid_forget()
self.A4_rubbing_marks_Type = tk.StringVar(self.A_Frame_measure)
# Dictionary with options
self.A4_choice_rubbing_marks= ['No', 'Yes']
self.A4_rubbing_marks_Type.set('') # set the default option
self.A4_Menu_rubbing_marks = tk.OptionMenu(self.A_Frame_measure, self.A4_rubbing_marks_Type, *self.A4_choice_rubbing_marks, command=self.show_rubbing_marks_borders)
self.A4_Menu_rubbing_marks.config(width=4)
self.A4_Menu_rubbing_marks.grid_forget()
'''
我定义了一个字典,但我遇到了太多问题。
'''
keys_blade_exchange_Type = [f"A{i}" for i in range(1, 200)]
self.blade_exchange_Type = {k_2: tk.StringVar(self.A_Frame_measure) for k_2 in keys_blade_exchange_Type}
self.choice_blade_exchange = ['No', 'Yes']
self.Menu_blade_exchange = {k_2: tk.OptionMenu(self.A_Frame_measure, *self.choice_blade_exchange , self.blade_exchange_Type[k_2]) for k_2 in keys_blade_exchange_Type}
for r, (k_2, cb_2) in enumerate(self.Menu_blade_exchange.items(), start=2):
cb_2.grid(row=r, column=1, sticky="W", padx=25, pady=4)
'''
解决方案
您可以使用一个简单的循环,setattr
并且getattr
.
for i in range(1, 201):
setattr(self, f'A{i}__rubbing_marks_Type', tk.StringVar(self.A_Frame_measure))
setattr(self, f'A{i}_choice_rubbing_marks', ['No', 'Yes'])
getattr(self, f'A{i}_rubbing_marks_Type').set('')
setattr(self, f'A{i}_Menu_rubbing_marks',
tk.OptionMenu(self.A_Frame_measure,
getattr(self, f'A{i}_rubbing_marks_Type'),
*getattr(self, f'A{i}_choice_rubbing_marks'),
command=self.show_rubbing_marks_borders))
getattr(self, f'A{i}_Menu_rubbing_marks').config(width=4)
getattr(self, f'A{i}_Menu_rubbing_marks').grid_forget()
如果f-strings
在您使用的 Python 版本中不可用,只需将它们替换为.format(i)
.