Возвращение пустого поля ввода в предыдущее состояние при нажатии

Объем переменной - это контекст, в котором он определен. По большей части все переменные 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 глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.

0
задан JH17-23 24 March 2019 в 19:49
поделиться

2 ответа

Просто добавьте 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
ответ дан Henry Yik 24 March 2019 в 19:49
поделиться

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

0
ответ дан stovfl 24 March 2019 в 19:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: