我目前正在开发我的第一个python程序,一个使用tkinter的预订系统。我有一个使用多个输入框的客户帐户创建屏幕。单击“输入”框后,将调用以下按键绑定以清除其指令的输入框(即“输入名称”)
def entry_click(event):
if "enter" in event.widget.get():
event.widget.delete(0, "end")
event.widget.insert(0, "")
event.widget.configure(fg="white")
#example Entry fields
new_name = Entry(root)
new_name.insert(0, "enter name")
new_name.bind('<FocusIn>', entry_click)
new_name.bind('<FocusOut>', entry_focusout)
new_email = Entry(root)
new_email.insert(0, "enter email")
new_email.bind('<FocusIn>', entry_click)
new_email.bind('<FocusOut>', entry_focusout)
同样,我正在寻找一种创建通用事件的方法,如果该唯一输入字段的适当文本返回到其初始状态(即“输入名字”或“输入电子邮件”),远离点击时,该框为空。
def entry_focusout():
if not event.widget.get():
event.widget.insert(fg="grey")
event.widget.insert(0, #[appropriate text here])
我该怎么做? 非常感谢。
答案 0 :(得分:1)
只需将arg添加到您的entry_focusout
事件中,并使用lambda函数将其绑定到Entry
小部件。
from tkinter import *
root = Tk()
def entry_click(event):
if event.widget["foreground"] == "grey":
event.widget.delete(0, "end")
event.widget.insert(0, "")
event.widget.configure(fg="black")
def entry_focusout(event, msg):
if not event.widget.get():
event.widget.configure(fg="grey") #you had a typo here
event.widget.insert(0, msg)
new_name = Entry(root,fg="grey")
new_name.insert(0, "enter name")
new_name.bind('<FocusIn>', entry_click)
new_name.bind('<FocusOut>', lambda e: entry_focusout(e, "enter name"))
new_email = Entry(root,fg="grey")
new_email.insert(0, "enter email")
new_email.bind('<FocusIn>', entry_click)
new_email.bind('<FocusOut>', lambda e: entry_focusout(e, "enter email"))
new_name.pack()
new_email.pack()
root.mainloop()
答案 1 :(得分:0)
问题:点击后,将空的
tk.Entry
框返回到先前的状态
以下是OOP
通用解决方案。
感谢@Henry Yik的if event.widget["foreground"] == "grey":
部分。
class EntryInstruction(tk.Entry):
def __init__(self, parent, instruction=None):
super().__init__(parent)
self.instruction = instruction
self.focus_out(None)
self.bind('<FocusIn>', self.focus_in)
self.bind('<FocusOut>', self.focus_out)
def focus_in(self, event):
if self["foreground"] == "grey":
self.delete(0, "end")
self.configure(fg="black")
def focus_out(self, event):
if not self.get():
self.configure(fg="grey")
self.insert(0, self.instruction)
用法:
class App(tk.Tk):
def __init__(self):
super().__init__()
entry = EntryInstruction(self, '<enter name>')
entry.grid(row=0, column=0)
entry = EntryInstruction(self, '<enter email>')
entry.grid(row=1, column=0)
if __name__ == "__main__":
App().mainloop()
使用Python测试:3.5