Python - 单选按钮和变量

时间:2014-03-27 22:41:51

标签: tkinter

我正在使用此程序选择(通过单选按钮)要在项目中使用的模型。然后,程序将相应地计算失败的概率。 我用了这段代码:

from Tkinter import *  
menu=Tk()    
def novo(n)
failure=random.randrange(10)
 if n==1:
     n=failure+5
 if n==2:
     n=failure+10
 if n==3:
     n=failure+15
 return n    
l1=Label(menu,text=" What model to use?").pack()
r1=Radiobutton(menu,text=' model 1',value=1,command=novo(1)).pack()
r2=Radiobutton(menu,text=' model 2',value=2,command=novo(2)).pack()
r3=Radiobutton(menu,text=' model 3',value=3,command=novo(3)).pack()
l2=Label(menu,text="Probability of failure:).pack()
l3=Label(menu,textvariable=n).pack()
b1=Button(menu,text="quit",command=menu.destroy).pack()    
menu.mainloop()

我运行程序时,只显示带有单选按钮的菜单窗口和文本“失败概率”。 为什么不打印函数novo()的结果?

1 个答案:

答案 0 :(得分:0)

让我们看一下这行代码:

r1=Radiobutton(menu,text=' model 1',value=1,command=novo(1)).pack()

此代码有两个问题。与您的问题相关的第一个问题是,代码将在创建按钮时调用novo ,并且该函数返回的任何内容都将提供给{{1} }属性。

command属性引用一个函数。相反,您正在调用函数,并使用结果。最简单的解决方案是使用lambda,这样可以轻松创建匿名函数。然后,这个匿名函数可以使用参数调用您的函数:

command

要获得更长的解释,请搜索lambda的tkinter问题 - 这个问题会得到解答并得到很多回答。

第二个问题是r1=Radiobutton(..., command=lambda: novo(1))... (以及所有其他类似变量)将始终为r1。在python中,当你执行None之类的操作时,x=foo().bar()将始终获得最后一个函数的结果。因此,当您执行x时,您将始终获得r1=Radiobutton(...).pack(...)的结果,该结果始终为pack()

Tkinter的最佳实践是将窗口小部件的创建与窗口小部件的布局分开。在你的情况下,它并不重要,因为你永远不会重复使用这些变量,但你应该养成以这种方式编码的习惯。例如:

None

这样做的好处是可以使代码更易于维护,因为所有布局代码都在一个地方。我看到许多问题,人们无法理解为什么他们的代码看起来并不像他们期望的那样,而且往往归结为他们在代码中分散了网格和/或包装语句这一事实,很难看到错误或想象代码应该做什么。