【问题标题】:Python - Radio buttons and variablesPython - 单选按钮和变量
【发布时间】:2014-03-28 22:04:37
【问题描述】:

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

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

【问题讨论】:

  • 你的缩进搞砸了,你有几个语法错误。这段代码不可能给你你所说的错误或行为,因为它根本无法运行。请发布实际代码。

标签: tkinter


【解决方案1】:

我们来看这行代码:

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

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

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

r1=Radiobutton(..., command=lambda: novo(1))...

要获得更长的解释,请在 tkinter 问题中搜索 lambda —— 这个问题被问到很多并且得到了很多回答。

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

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

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

这具有使您的代码更易于维护的优点,因为您的所有布局代码都在一个地方。我看到很多问题,人们无法理解为什么他们的代码看起来不像他们期望的那样,这通常归结为他们的代码中散布着网格和/或打包语句,很难看到错误或可视化代码应该做什么。

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 2015-06-15
    • 2016-09-01
    • 2015-03-18
    • 1970-01-01
    • 2013-03-14
    • 2017-09-20
    • 2019-03-20
    • 2013-02-12
    相关资源
    最近更新 更多