“如何写得更多”;Pythonically“;
因此,我尝试编写一组复选框(实际上我应该将其作为一个类编写,因为我们很可能会添加其他复选框) 到目前为止,我已经得到了这个,但它重复了代码,因此效率不高。我可以通过哪些方式使代码更优雅“如何写得更多”;Pythonically“;,python,tkinter,Python,Tkinter,因此,我尝试编写一组复选框(实际上我应该将其作为一个类编写,因为我们很可能会添加其他复选框) 到目前为止,我已经得到了这个,但它重复了代码,因此效率不高。我可以通过哪些方式使代码更优雅 var1 = IntVar() var2 = IntVar() var3 = IntVar() c1 = Checkbutton(text="Snagit", variable=var1) c1.pack() c2 = Checkbutton(text="Camtasia", variable=var2) c
var1 = IntVar()
var2 = IntVar()
var3 = IntVar()
c1 = Checkbutton(text="Snagit", variable=var1)
c1.pack()
c2 = Checkbutton(text="Camtasia", variable=var2)
c2.pack()
c3 = Checkbutton(text="GotoMeeting", variable=var3)
c3.pack()
app.mainloop()
check1 = var1.get()
check2 = var2.get()
check3 = var3.get()
下面是一个如何使用循环使其更好的快速示例:
check_names = ["Snagit", "Camtasia", "GotoMeeting"]
variables = []
for name in check_names:
variables.append(IntVar())
Checkbutton(text=name, variable=variables[-1]).pack()
app.mainloop()
checks = [variable.get() for variable in variables]
虽然使用
itertools
模块看起来有点吓人,但我还是提出了这个解决方案,但我发誓学习它是为了你自己好!:)
我不知道这是不是肾盂,但我觉得它更干净一点
vars = {}
buttons = {}
for text in ('Snagit', 'Camtasia', 'GotoMeeting'):
vars[text] = IntVar()
buttons[text] = Checkbutton(text=text, variable=vars[text])
buttons[text].pack()
app.mainloop()
checks = [var.get() for var in vars.values()]
通过使用
dict
s和tuple
s,可以消除重复。这并不像某些只使用生成器的解决方案那样吸引人,但在这里没有理由这样做,我认为这更具可读性。累积变量并在线创建按钮:
variables = []
for text in ['Snagit', 'Camtasia', 'Gotomeeting']:
variable = IntVar()
Checkbutton(text=text, variable=variable).pack()
variables.append(variable)
app.mainloop()
checks = [variable.get() for variable in variables]
除了在一行上使用元组解包和组合调用之外,您无法做太多的事情使它更“Pythonic”…
vars=[IntVar(),IntVar(),IntVar()]。。。检查=[v.get()for v in vars]
将是一个开始……重复,重复,重复-两次是共关联,三次意味着使用数组和循环!是的,这更像是这样,尽管我对那些重复的IntVar()
仍有复杂的感觉。你为什么要输入IntVar
?这应该在循环中。对于vars
,使用xrange会更具可读性,但这项工作做得非常好。Itertools可能适合某些工作,但对于此任务来说不必要的复杂。您的三行代码比另一个使用简单for循环的答案更难理解。对我来说,当我阅读代码时,zip就像一个小小的减速器,因为我只是不经常看到或使用它。@Bryan Oakley:我不介意否决票(假设是你;如果不是,请忽略),但我很确定这归结为个人偏好。由于itertools模块的多功能性,我一直在使用它,并试图在Python代码中避免使用“Java”之类的东西,以至于更详细的代码对我来说就像是一个“减速器”。当然,你可以有不同的意见,我完全尊重它。<代码> [C包()在按钮中] < /COD> >我不认为列表理解的副作用是非常复杂的。好吧,取决于它的观点。pack()的具体功能。如果它返回一个压缩的c,那么就可以了。如果您滥用[]来编写for循环,我认为这不是pythonic。看起来你是这样的,因为你没有给名单上的名字。你说的虐待是对的。我现在把它变成了一个循环。
vars = {}
buttons = {}
for text in ('Snagit', 'Camtasia', 'GotoMeeting'):
vars[text] = IntVar()
buttons[text] = Checkbutton(text=text, variable=vars[text])
buttons[text].pack()
app.mainloop()
checks = [var.get() for var in vars.values()]
variables = []
for text in ['Snagit', 'Camtasia', 'Gotomeeting']:
variable = IntVar()
Checkbutton(text=text, variable=variable).pack()
variables.append(variable)
app.mainloop()
checks = [variable.get() for variable in variables]