离开

时间:2019-03-24 19:49:56

标签: python tkinter

我目前正在开发我的第一个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])

我该怎么做? 非常感谢。

2 个答案:

答案 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