Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何写得更多”;Pythonically“;_Python_Tkinter - Fatal编程技术网

“如何写得更多”;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]