Возвращение пустого поля ввода в предыдущее состояние при нажатии - PullRequest
0 голосов
/ 24 марта 2019

В настоящее время я разрабатываю свою первую программу на 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 ]

1 голос
/ 25 марта 2019

Просто добавьте arg к вашему событию entry_focusout и привяжите к виджетам 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()
0 голосов
/ 25 марта 2019

Вопрос : Возврат пустого поля 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...