Передача ввода виджета Entry в функцию привязки / обработчика событий - PullRequest
0 голосов
/ 22 марта 2019

Python новичок здесь. У меня есть виджет «Ввод», и я хочу использовать для него привязку клавиш, которая позволяет мне размещать такие инструкции, как «Ввод любимой еды», прямо в поле ввода и убирать его при щелчке, чтобы пользователь мог заполнить поле. Я могу сделать это достаточно легко с глобальными переменными, используя Entry.get ()

global favourite_food 
favourite_food = Entry(window)
favourite_food.insert(0, 'Input Favourite Food')
fist_name.bind('<FocusIn>', food_click)

и

def food_click(event):
    if favourite_food.get() == 'Input Favourite Food':
       favourite_food.delete(0, "end")
       favourite_food.insert(0, '')

Я пытался из соображений эффективности найти способ избежать использования глобала и вместо этого использовать лямбду, но мне не повезло заставить его работать.

Помощь очень ценится.

Ответы [ 3 ]

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

Вы можете использовать события <FocusIn> и <FocusOut>, чтобы делать то, что вы хотите.Ниже приведен пользовательский Entry для его достижения:

class MyEntry(Entry):
    def __init__(self, *args, **kwargs):
        self.prompt = kwargs.pop('prompt') if 'prompt' in kwargs else None
        super().__init__(*args, **kwargs)
        if self.prompt:
            self.bind('<FocusIn>', self.on_focus_in)
            self.bind('<FocusOut>', self.on_focus_out)
            self.on_focus_out()

    def on_focus_in(self, event=None):
        if self.get() == self.prompt:
            self.delete(0, 'end')
            self.config(fg='black')

    def on_focus_out(self, event=None):
        if self.get() == '':
            self.insert('end', self.prompt)
            self.config(fg='gray')

Затем вы можете инициализировать запись как обычно с ключевым словом аргумента prompt, чтобы показать сообщение:

entry = MyEntry(prompt='Enter favorite food')
0 голосов
/ 22 марта 2019

Вам не нужно ничего передавать или использовать глобальный. Объект события, переданный в функцию, имеет все необходимое:

def food_click(event):
    if event.widget.get() == 'Input Favourite Food':
        event.widget.delete(0, "end")
        event.widget.insert(0, '')
0 голосов
/ 22 марта 2019

Вам трудно помочь, потому что у нас мало кода, но это должно сработать

favourite_food = Entry(window)
favourite_food.insert(0, 'Input Favourite Food')
fist_name.bind('<FocusIn>', lambda event: food_click(favourite_food))

def food_click(entry):
    if entry.get() == 'Input Favourite Food':
        entry.delete(0, "end")
        entry.insert(0, '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...