Tkinter Python-单选按钮和变量

Tkinter Python-单选按钮和变量,tkinter,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=" W

我使用这个程序通过单选按钮选择项目中要使用的模型。然后,程序将相应地计算故障概率。 我使用了以下代码:

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的结果?

让我们看看这行代码:

r1=Radiobutton(menu,text=' model 1',value=1,command=novo(1)).pack()
此代码有两个错误。与您的问题相关的第一个问题是,代码将在创建按钮时调用novo,并且该函数返回的任何内容都将被赋予command属性

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

r1=Radiobutton(..., command=lambda: novo(1))...
要获得更详细的解释,请搜索lambda的tkinter问题-这个问题会被问到很多,也会得到很多回答

第二个问题是r1和所有其他类似变量始终为零。在python中,当您执行类似于x=foo.bar的操作时,x将始终获得最后一个函数的结果。因此,当您执行r1=Radiobutton….pack…,您将始终得到pack的结果,而pack的结果始终为None

Tkinter的最佳实践是将小部件的创建与小部件的布局分开。在您的情况下,这并不重要,因为您从不重用这些变量,但您应该养成这样编码的习惯。例如:

r1 = Radiobutton(...)
r2 = Radiobutton(...)
r3 = Radiobutton(...)
...
r1.pack()
r2.pack()
r3.pack()
...

这样做的好处是使代码更易于维护,因为所有布局代码都位于一个位置。我看到很多问题,人们无法理解为什么他们的代码看起来不像他们期望的那样,这通常归结为这样一个事实:他们的代码中散布着网格和/或pack语句,这使得很难看到错误或想象代码应该做什么。

您的缩进很混乱,您有几个语法错误。这段代码不可能给出您所说的错误或行为,因为它根本无法运行。请张贴实际代码。