2013-11-01 34 views
0

我正在尝试使用TKinter创建地址簿。我有'姓名,年龄,电话等等'的输入字段。在每一个文本里面都有文字说明每个人是什么。所以在名称输入字段中,它会显示'输入名称'。我想要的是,当有人在名称输入字段中单击以开始输入时,它会删除当前位于其中的文本。我知道我需要做一个函数来清除这个条目,然后绑定到输入字段,但我卡住了。将函数绑定到Tkinter文本输入字段

你可以在底部看到我想用'def clearEvent'并试图将其绑定到TextField。我的问题是,def clearEvent函数低于一切,需要在顶部?还是我犯了一些其他错误?

from Tkinter import * 
import sqlite3 

class Hello(): 
    def __init__(self, master): 

     frame=Frame(master, width=80, height=50) 
     frame.pack() 
     self.text = Label(frame, text="    ") 
     self.text.pack() 
     self.text.grid(row=0, sticky=W) 

     self.lab = Label(frame, text="name") 
     self.lab.pack(side=LEFT) 
     self.lab.grid(row=1) 

     self.TextField = Entry(frame, text = "name", width=30) 
     self.TextField.insert(0, "Enter Name") 
     self.TextField.pack() 
     self.TextField.grid(row=1) 
     self.TextField.bind("<Enter>", clearEvent) 

     self.TextField2 = Entry(frame, text = "age", width=30) 
     self.TextField2.insert(0, "Enter Age") 
     self.TextField2.pack() 
     self.TextField2.grid(row=2) 

     self.TextField3 = Entry(frame, text = "phone", width=30) 
     self.TextField3.insert(0, "Enter Phone #") 
     self.TextField3.pack() 
     self.TextField3.grid(row=3) 

     self.TextField4 = Entry(frame, text = "fblink", width=30) 
     self.TextField4.insert(0, "Enter Facebook Link") 
     self.TextField4.pack() 
     self.TextField4.grid(row=4) 

     self.btn=Button(frame, text='Add', command=self.add_note) 
     self.btn.pack() 
     self.btn.grid(row=5, rowspan=1, sticky="w") 

     self.showbtn = Button(frame, text='Update', command=self.show_notes) 
     self.showbtn.pack() 
     self.showbtn.grid(row=5, rowspan=1, sticky="") 

     self.delbtn = Button(frame, text='Delete', command=self.del_notes) 
     self.delbtn.pack() 
     self.delbtn.grid(row=5, rowspan=1, sticky="e") 


     self.content=Listbox(master, width=50) 
     self.content.pack() 

    def clearEvent(self, event): 
     self.TextField.delete(0,END) 

回答

0

当鼠标进入窗口小部件时会触发该事件<Enter>。你说你想在用户点击widget时清除它,这是一个不同的事件。您应该绑定到<1>,当用户单击窗口小部件中的鼠标左键时将触发<1>。更好的是,绑定到<FocusIn>事件,当焦点移动到该小部件时,无论是通过点击还是通过用户按下标签,该事件都会触发。

不过,我想你会意识到这不会给用户一个很好的体验。如果他们填写表格,然后意识到他们在一个领域犯了拼写错误?他们点击该字段进行编辑和BOOM!无论什么东西都消失了,他们不得不重新整个领域。

您可能想重新考虑这个计划。例如,当有占位符文本时,您可能希望前景色为浅灰色。然后,在你的功能中,你首先检查一下颜色是什么。如果它是黑色的,什么都不要做。它是浅灰色,请删除文本,然后确保将颜色设置为黑色,以便下次用户单击时,文本不会被删除。

+0

我把,现在它说全局名称“NameError”:clearEvent没有定义 – user2897013

+0

@ user2897013:好吧,根据你的代码,'clearEvent' _is_ undefined。然而,有一个'self.clearEvent'。 –

+0

nm,用self.clearEvent代替clearEvent,它工作。 – user2897013

0

你已经绑定的文本字段ENTER而不是鼠标点击。 其他一切似乎都很好

相关问题