在 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中按下按钮之前使窗口状态空闲?