2015-05-27 3 views
2

Как вставить временный текст в виджет tkinter Entry?Как вставить временный текст в виджет входа tkinter?

К примеру, у меня есть ярлык User и рядом с ним у меня есть въездной виджет, который должен иметь некоторый текст "Enter your username..." в начале приложения, и при отдаче курсора на Вход виджете, он должен удалить "Enter your username..." и позволить пользователю для ввода данных.

Это мой текущий код:

import tkinter as tk 

root = tk.Tk() 

label = tk.Label(root, text="User:") 
label.pack() 
entry = tk.Entry(root, bd=1, show="Enter your user name...") 
entry.pack() 

root.mainloop() 

Как я могу это сделать?

Я не нашел никакой опции или метода для удаления данных при установке курсора на виджет ввода.

+1

Duplicate http://stackoverflow.com/questions/27820178/how-to-add-placeholder-in-a-text-field-in-tkinter? –

+0

Вы не нашли ни одного параметра или способа удалить данные или поместить курсор в текстовое поле? Где ты посмотрел? Он документирован во многих местах (например: http://effbot.org/tkinterbook/entry.htm#Tkinter.Entry.insert-method, http://effbot.org/tkinterbook/entry.htm#Tkinter.Entry.delete- метод) –

ответ

1

Я хотел бы добавить что-то к ответам, что не было сказано. Как сказал 9jera, мы можем сделать виджет Entry ясным только тогда, когда он видит текст по умолчанию вместо метода «firstclick», используемого Leo Tenenbaum.

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

Это может быть достигнуто следующим образом:

import Tkinter as tk 


def on_entry_click(event): 
    """function that gets called whenever entry is clicked""" 
    if entry.get() == 'Enter your user name...': 
     entry.delete(0, "end") # delete all the text in the entry 
     entry.insert(0, '') #Insert blank for user input 
     entry.config(fg = 'black') 
def on_focusout(event): 
    if entry.get() == '': 
     entry.insert(0, 'Enter your username...') 
     entry.config(fg = 'grey') 


root = tk.Tk() 

label = tk.Label(root, text="User: ") 
label.pack(side="left") 

entry = tk.Entry(root, bd=1) 
entry.insert(0, 'Enter your user name...') 
entry.bind('<FocusIn>', on_entry_click) 
entry.bind('<FocusOut>', on_focusout) 
entry.config(fg = 'grey') 
entry.pack(side="left") 

root.mainloop() 

Наконец, я также добавил серый цвет для текста по умолчанию и черный к одной написанной пользователем, только для тех, кто задавался вопросом об этом. Единственная проблема, которую я вижу здесь, заключается в том, что если пользователь на самом деле вручную вводит там Enter your user name..., фокус и снова, текст будет удален, даже если он был написан самим пользователем. Одно из решений, о котором я думал, - это изменить оператор if, чтобы он получил цвет вместо текста по умолчанию перед удалением чего-либо. Если цвет серый, он может продолжить и удалить его. Иначе это не будет. Тем не менее, я не нашел способ получить цвет текста. Если кто-нибудь знает об этом, пожалуйста, дайте мне знать!

3

Я думаю, что это должно работать:

import Tkinter as tk 


firstclick = True 

def on_entry_click(event): 
    """function that gets called whenever entry1 is clicked"""   
    global firstclick 

    if firstclick: # if this is the first time they clicked it 
     firstclick = False 
     entry.delete(0, "end") # delete all the text in the entry 


root = tk.Tk() 

label = tk.Label(root, text="User: ") 
label.pack(side="left") 

entry = tk.Entry(root, bd=1) 
entry.insert(0, 'Enter your user name...') 
entry.bind('<FocusIn>', on_entry_click) 
entry.pack(side="left") 

root.mainloop() 

Это удалит Enter your user name..., когда пользователь нажимает на запись entry.

+2

Это не сработает, если они используют клавишу табуляции для перемещения фокуса к entrt. Лучше было бы привязать на '' –

+0

Его рабочий Лев Тененбаум. Спасибо. –

0

Из кода Льва entry1.delete следует изменить на entry.delete.

Также виджет ввода из его кода очищается только при первом щелчке, но вы можете сделать виджет Entry очищенным только тогда, когда он установлен на текст по умолчанию. Это может быть полезно, если ваш код должен повториться.

Попробуйте это:

import Tkinter as tk 


def on_entry_click(event): 
    """function that gets called whenever entry is clicked""" 
    if entry.get() == 'Enter your user name...': 
     entry.delete(0, "end") # delete all the text in the entry 
     entry.insert(0, '') #Insert blank for user input 


root = tk.Tk() 

label = tk.Label(root, text="User: ") 
label.pack(side="left") 

entry = tk.Entry(root, bd=1) 
entry.insert(0, 'Enter your user name...') 
entry.bind('<FocusIn>', on_entry_click) 
entry.pack(side="left") 

root.mainloop()