获取复选框

时间:2015-07-30 18:12:40

标签: python checkbox tkinter

这是我在搜索理解和了解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_check'

     

Tkinter回调中的异常

如何避免此错误?

1 个答案:

答案 0 :(得分:0)

您在代码中使用了太多快捷方式。让我们看一个例子:

Label(text="Contact List").grid(row=0,column=0,columnspan=2)

这会创建Label,但不会保存对它的引用。它将显示在GUI中,但如果您想要返回它,您将无法做到。当您拥有类似Entry小部件的内容时,这非常重要,您可以保证再次使用该小部件(get())。

另一个问题是您将几何管理链接到窗口小部件创建。如果你确实保存了对它的引用,它只会指向None,这是几何管理方法返回的值。

要解决此问题,请解除语句并保存引用:

self.cl_label = Label(text="Contact List")
self.cl_label.grid(row=0,column=0,columnspan=2)

为您创建的每个小部件执行此操作。

对于friend_check,您需要使其成为实例变量而不是局部变量,因为局部变量在其范围之外不可用,并在包含函数结束时被丢弃。通过将self.添加到引用名称来执行此操作。

self.friend_check = IntVar()