2010-02-14 3 views
15

Я пытаюсь очистить виджет Entry после того, как пользователь нажал кнопку с помощью Tkinter.Как очистить виджет ввода после нажатия кнопки в Tkinter?

Я пробовал использовать ent.delete(0, END), но я получил ошибку, говоря, что строки не имеют атрибута delete.

Вот мой код, где я получаю сообщение об ошибке на real.delete(0, END):

secret = randrange(1,100) 
print(secret) 
def res(real, secret): 
    if secret==eval(real): 
     showinfo(message='that is right!') 
    real.delete(0, END) 

def guess(): 
    ge = Tk() 
    ge.title('guessing game') 

    Label(ge, text="what is your guess:").pack(side=TOP) 

    ent = Entry(ge) 
    ent.pack(side=TOP) 

    btn=Button(ge, text="Enter", command=lambda: res(ent.get(),secret)) 
    btn.pack(side=LEFT) 

    ge.mainloop() 

ответ

26

После ковыряться немного через Introduction to Tkinter, я придумал приведенный ниже код, который не делает ничего, кроме отображения текстового поля и очистить его, когда кнопка нажата "Clear text":

import tkinter as tk 

class App(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self, master, height=42, width=42) 
     self.entry = tk.Entry(self) 
     self.entry.focus() 
     self.entry.pack() 
     self.clear_button = tk.Button(self, text="Clear text", command=self.clear_text) 
     self.clear_button.pack() 

    def clear_text(self): 
     self.entry.delete(0, 'end') 

def main(): 
    root = tk.Tk() 
    App(root).pack(expand=True, fill='both') 
    root.mainloop() 

if __name__ == "__main__": 
    main() 
+1

Вы можете указать аргумент END (или «конец») вместо вычисления длины данных. Поскольку вы говорите, что это не сработало, но не определило, что «не работает» (т. Е. Вы получили сообщение об ошибке, или это тихо провалилось?), Я предполагаю, что вы использовали неквалифицированный «КОНЕЦ». Вместо этого попробуйте «Tkinter.END». Когда я использую это в приведенном выше коде, он работает нормально. –

+0

@Bryan: Ах, я просто использовал END, а не Tkinter.END (учебник использовал 'from ... import' вместо импорта). Благодаря! Исправление находится в коде. – GreenMatt

+0

Я хочу, чтобы кнопка выполняла 2 действия одновременно. первый должен выполнить случайное действие, а второй - очистить запись – Dan

2

Я неясно ваш вопрос. От http://effbot.org/tkinterbook/entry.htm#patterns, это кажется, вам просто нужно выполнить задание после того, как вы вызвали удаление. Чтобы добавить текст ввода в виджет, используйте метод insert. Чтобы заменить текущий текст, вы можете вызвать delete, прежде чем вставлять новый текст.

e = Entry(master) 
e.pack() 

e.delete(0, END) 
e.insert(0, "") 

Не могли бы вы разместить еще немного кода?

+0

ответ «это кажется вам просто нужно сделать задание после того, как вы назвали удаление» никоим образом не отвечает на вопрос «как очистить запись виджета». –

+0

Это мне очень помогло: e.delete (0, END), спасибо Чарльзу. –

4

real получает значение ent.get(), которое является просто строкой. Он понятия не имеет, откуда он появился, и никак не повлиять на виджет.

Вместо real.delete(), вызовите .delete() на самом въездной виджет:

def res(ent, real, secret): 
    if secret == eval(real): 
     showinfo(message='that is right!') 
    ent.delete(0, END) 

def guess(): 
    ... 
    btn = Button(ge, text="Enter", command=lambda: res(ent, ent.get(), secret)) 
5

ent.delete(0, END) является правильным ответом, предполагая, что ent является собственно ссылкой на въездном виджет. Если вы получите сообщение об ошибке, которое вы говорите, у вас есть ошибка в коде. Вам нужно будет показать нам код, если вы не можете определить ошибку самостоятельно.

-6

Try с этим:

import os 
os.system('clear') 
+1

, пожалуйста, подумайте о добавлении минимального ifo, чтобы понять код –

+3

Нет, это абсолютно не сработает. Это очищает экран, а не виджет в окне. –

+0

Это не имеет никакого отношения к вопросу. – cpburnz

0

Прежде всего, убедитесь, что текст включен, а затем удалить теги, а затем содержимое.

myText.config(state=NORMAL) 
myText.tag_delete ("myTags") 
myText.delete(1.0, END) 

Когда текст «ОТКЛЮЧЕН», удаление не работает, потому что текстовое поле находится в режиме только для чтения.

0

Вы должны использовать ent.delete(0,"end") вместо «END», используйте «конец» внутри цитаты.

secret = randrange(1,100) 
print(secret) 
def res(real, secret): 
    if secret==eval(real): 
     showinfo(message='that is right!') 
    real.delete(0, END) 

def guess(): 
    ge = Tk() 
    ge.title('guessing game') 

    Label(ge, text="what is your guess:").pack(side=TOP) 

    ent = Entry(ge) 
    ent.pack(side=TOP) 

    btn=Button(ge, text="Enter", command=lambda: res(ent.get(),secret)) 
    btn.pack(side=LEFT) 

    ge.mainloop() 

Это должно решить вашу проблему

Смежные вопросы