这是我在搜索理解和了解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回调中的异常
如何避免此错误?
答案 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()