Python 获取复选框的值
这是我在搜索以理解和了解Tkinter时发现的代码,但它在复选框切换上给出了一个错误Python 获取复选框的值,python,checkbox,tkinter,Python,Checkbox,Tkinter,这是我在搜索以理解和了解Tkinter时发现的代码,但它在复选框切换上给出了一个错误 from Tkinter import * class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI()
from Tkinter import *
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Windows")
Label(text="Contact List").grid(row=0,column=0,columnspan=2)
Text(width=30,height=15).grid(row=1,rowspan=9, column=0,columnspan=2,padx=20)
Button(text="Display Contact").grid(row=10, column=0,columnspan=2,pady=10)
Label(text="Last Name:").grid(row=11, column=0,pady=10)
Entry().grid(row=11,column=1)
Button(text="Search").grid(row=12,column=0,columnspan=2)
Label(text="New Contact").grid(row=0,column=2,columnspan=2)
Label(text="First Name:").grid(row=1,column=2,sticky=E)
Entry().grid(row=1,column=3)
Label(text="Last Name:").grid(row=2,column=2,sticky=E)
Entry().grid(row=2,column=3)
Label(text="Phone #:").grid(row=3,column=2,sticky=E)
Entry().grid(row=3,column=3)
friend_check = IntVar()
Checkbutton(variable=friend_check, command = self.friend_box, onvalue=1, offvalue=0, text = "Friend").grid(row=4,column=3,sticky=W)
#Label(text="Friend").grid(row=4,column=3,padx=20,sticky=W)
Label(text="Email:").grid(row=5,column=2,sticky=E)
Entry().grid(row=5,column=3)
Label(text="Birthday:").grid(row=6,column=2,sticky=E)
Entry().grid(row=6,column=3)
Button(text="Add Contact").grid(row=7,column=3,sticky=E)
def friend_box(self):
if self.friend_check.get() == 1:
print '1'
else:
print '0'
def main():
root = Tk()
root.geometry("600x450+900+300")
root.resizable(0,0)
app = Example(root)
root.mainloop()
if __name__ == '__main__':
main()
这就是上面提到的错误:
AttributeError:示例实例没有属性“friend\u check”
Tkinter回调中的异常
如何避免此错误?代码中的快捷方式太多。让我们看一个例子:
Label(text="Contact List").grid(row=0,column=0,columnspan=2)
这会创建一个标签
,但不会保存对它的引用。它将显示在GUI中,但是如果您想再次引用它,您将无法。当您有类似于条目
小部件的东西时,这一点很重要,您几乎可以保证再次使用它(对于get()
)
另一个问题是几何体管理链接到小部件创建。如果您确实保存了对此的引用,它只会指向None
,这是几何体管理方法返回的值
要解决此问题,请取消对语句的锁定并保存引用:
self.cl_label = Label(text="Contact List")
self.cl_label.grid(row=0,column=0,columnspan=2)
对您创建的每个小部件执行此操作
对于friend\u check
,您需要将其设置为实例变量而不是局部变量,因为局部变量在其作用域之外不可用,并且在包含函数结束时会被丢弃。为此,请在引用名称前面加上self.
self.friend_check = IntVar()
NameError:未使用self定义全局名称“friend\u check”。补充。谢谢你列举的问题是的,这就是为什么我说把它叫做
self.friend\u check
。在任何地方使用这个名字,而不是简单的friend\u check
。很高兴听到这个名字!您可以通过单击其分数下方的复选标记来表示此答案解决了您的问题。您还需要确保在初始化UI之前定义了self.friend\u check
。发布的代码会在之后执行。这就是问题中错误的根本原因。@BryanOakley-在最初的问题中,该变量是在适当的时间定义的。然而,OP随后编辑了问题代码,将此答案的建议自我纳入其中。
,并将定义移动到\uuuuu init\uuuu()
。我将把它回滚,这样这个问题就又有意义了。