2

所以我正在尝试编写一组复选框(我实际上应该将它写成一个类,因为我们很可能会添加其他复选框)

到目前为止,我已经得到了这个,但这会重复代码,因此效率不高。我可以通过哪些方式使代码更优雅?

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()
4

5 回答 5

3

这是一个快速示例,说明如何使用循环使其变得更好:

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]
于 2012-05-22T19:54:55.083 回答
3

我提出了这个解决方案,虽然itertools模块的使用可能看起来有点令人生畏,但我发誓学习它是为了你自己好!:)

labels = ("snagit", "camtasia", "gotomeeting")
vars = [IntVar() for _ in labels]
for name, v in itertools.izip(labels, vars):
    Checkbutton(text=name, variable=v).pack()
app.mainloop()
checks = [v.get() for v in vars]
于 2012-05-22T19:58:38.963 回答
2
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()]

通过使用dicts 和tuples,您可以消除重复。这不像某些仅使用生成器的解决方案那样性感,但这里没有理由这样做,我认为这更具可读性。

于 2012-05-22T20:01:58.633 回答
2

累积变量并内联创建按钮:

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]
于 2012-05-22T20:02:15.703 回答
0
vars = [IntVar() for i in xrange(3)]
buttons = [Checkbutton(text="Snagit", variable=vars[0]),Checkbutton(text="Camtasia", variable=vars[1]),Checkbutton(text="GotoMeeting", variable=vars[2])]
for c in buttons:
  c.pack()

app.mainloop()
check1,check2,check3  = [v.get() for v in vars]

我不知道这是否是 Pythonic,但我认为它更干净一些。

于 2012-05-22T19:59:18.653 回答