Объем переменной - это контекст, в котором он определен. По большей части все переменные PHP имеют только одну область. В эту единую область охвата включены и требуемые файлы. Например:
<?php
$a = 1;
include 'b.inc';
?>
Здесь переменная $a
будет доступна в включенном скрипте b.inc
. Однако в пользовательских функциях вводится локальная функция. Любая переменная, используемая внутри функции, по умолчанию ограничена областью локальных функций. Например:
<?php
$a = 1; /* global scope */
function test()
{
echo $a; /* reference to local scope variable */
}
test();
?>
Этот сценарий не будет выдавать какой-либо вывод, потому что оператор echo ссылается на локальную версию переменной $ a, и ей не присваивается значение в этой области. Вы можете заметить, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны для функций, если они не переопределены локальным определением. Это может вызвать некоторые проблемы в том, что люди могут непреднамеренно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.
Просто добавьте 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()
Вопрос : Возврат пустого поля
blockquote>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)
Использование :
blockquote>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