我正在使用此程序选择(通过单选按钮)要在项目中使用的模型。然后,程序将相应地计算失败的概率。 我用了这段代码:
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()的结果?
答案 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
这样做的好处是可以使代码更易于维护,因为所有布局代码都在一个地方。我看到许多问题,人们无法理解为什么他们的代码看起来并不像他们期望的那样,而且往往归结为他们在代码中分散了网格和/或包装语句这一事实,很难看到错误或想象代码应该做什么。