将空的tk输入框返回到单击离开时的前一状态

2024-04-26 11:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我怎么能做到? 非常感谢。你知道吗


Tags: nameeventnewifbindemaildefwidget
2条回答

Question: Return empty tk.Entry box to previous state when clicked away

以下是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)

Usage:

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测试

只需向entry_focusout事件添加一个arg,并使用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()

相关问题 更多 >