Python 获取复选框的值

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()

这是我在搜索以理解和了解Tkinter时发现的代码,但它在复选框切换上给出了一个错误

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()
。我将把它回滚,这样这个问题就又有意义了。