在 Tkinter 中按下按钮后如何清除 Entry 小部件?

Posted

技术标签:

【中文标题】在 Tkinter 中按下按钮后如何清除 Entry 小部件?【英文标题】:How to clear the Entry widget after a button is pressed in Tkinter? 【发布时间】:2011-01-16 15:26:46 【问题描述】:

在用户使用 Tkinter 按下按钮后,我正在尝试清除 Entry 小部件。

我尝试使用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()

【问题讨论】:

【参考方案1】:

在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()

【讨论】:

您可以提供参数 END(或“end”)而不是计算数据的长度。由于您说它不起作用但没有定义“不起作用”(即:您收到错误,还是默默地失败了?),我猜您使用了不合格的“END”。请改用“Tkinter.END”。当我在上面的代码中使用它时,它工作得很好。 @Bryan:啊,我只使用了 END,而不是 Tkinter.END(本教程使用 from ... import 而不是只导入)。谢谢!修复在代码中。 我希望按钮同时执行 2 个操作。第一个是执行随机动作,第二个是清除条目 请注意,如果您这样做,您的 Entry 小部件的状态必须是正常的。亲自遇到过这个错误:)。 如果你使用的是 Python 3.x 版本,你必须更加小心清除输入框 - e.delete(0, tkinter.END)【参考方案2】:

我不清楚你的问题。来自http://effbot.org/tkinterbook/entry.htm#patterns,它 似乎您只需要在调用删除后进行分配。 要将条目文本添加到小部件,请使用 insert 方法。要替换当前文本,您可以在插入新文本之前调用 delete。

e = Entry(master)
e.pack()

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

你能发布更多代码吗?

【讨论】:

答案“看起来你只需要在调用删除后做一个作业”绝不回答“如何清除条目小部件”的问题。【参考方案3】:

real 获取值ent.get(),它只是一个字符串。它不知道它来自哪里,也无法影响小部件。

在入口小部件本身上调用.delete(),而不是real.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))

【讨论】:

【参考方案4】:

您应继续使用ent.delete(0,"end") 而不是使用'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()

这将解决您的问题

【讨论】:

【参考方案5】:

如果您使用的是 Python 3.x,则必须使用

txt_entry = 入口(根)

txt_entry.pack()

txt_entry.delete(0, tkinter.END)

【讨论】:

顺便提醒大家,如果你import tkinter as tk,那你就得用txt_entry.delete(0, tk.END)【参考方案6】:

首先,确保文本已启用,然后删除您的标签,然后是内容。

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

当文本为“禁用”时,删除不起作用,因为文本字段处于只读模式。

【讨论】:

【参考方案7】:
def clear():                                                                           
        global input                                                                    
        abc =  
        input.set(abc)                                                                     

root = Tk()                                                               
input = StringVar()                                                             
ent = Entry(root,textvariable =                                       input,font=('ariel',23,'bold'),bg='powder                            blue',bd=30,justify='right').grid(columnspan=4,ipady=20)                       
Clear = Button(root,text="Clear",command=clear).pack()                       

输入设置条目中的文本变量,这是字符串变量,当我将字符串变量的文本设置为“”时,会清除条目中的文本

【讨论】:

Python 需要缩进:)【参考方案8】:

只需定义一个函数并将 Combobox 的值设置为空/null 或您想要的任何值。请尝试以下操作。

def Reset():
    cmb.set("")

这里,cmb 是一个变量,您在其中分配了组合框。现在在按钮中调用该函数,例如,

btn2 = ttk.Button(root, text="Reset",command=Reset)

【讨论】:

【参考方案9】:

如果你添加打印代码来检查real的类型,你会看到real是一个字符串,而不是一个Entry,所以没有delete属性。

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

>> output: <class 'str'>

解决方案:

secret = randrange(1,100)
print(secret)

def res(real, secret):
    if secret==eval(real):
        showinfo(message='that is right!')
    ent.delete(0, END)    # we call the entry an delete its content

def guess():

    ge = Tk()
    ge.title('guessing game')

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

    global ent    # Globalize ent to use it in other function
    ent = Entry(ge)
    ent.pack(side=TOP)

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

    ge.mainloop()

它应该可以工作。

【讨论】:

【参考方案10】:

根据我的经验,Entry.delete(0, END) 有时在 entry 小部件的状态为 DISABLED 时不起作用。当Entry.delete(0, END) 不起作用时检查Entry 的状态,如果entry 小部件的值仍然存在,则调用entry.update() 以反映delete(0, END) 的结果。

【讨论】:

【参考方案11】:

如果以上都不起作用,你可以使用这个->

idAssignedToEntryWidget.delete(first = 0, last = UpperLimitAssignedToEntryWidget)

例如->

分配的id is = en then

en.delete(first =0, last =100)

【讨论】:

这毫无意义【参考方案12】:

试试这个:

import os
os.system('clear')

【讨论】:

不,这绝对行不通。这会清除屏幕,而不是窗口中的小部件。 这与问题无关。 这与问题无关 与问题无关

以上是关于在 Tkinter 中按下按钮后如何清除 Entry 小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python tkinter中按下按钮之前使窗口状态空闲?

确定在 Tkinter 中按下了哪个按钮?

当在Tkinter中按下给定按钮时,我无法触发随机功能

在 inputBarAccessoryView 中按下发送后如何清除 MessageKit inputBar 中的文本

即使在sencha中按下按钮后,如何使按钮的图像可见

在android中按下后退按钮后如何返回相同的选项卡?