【问题标题】:How to clear the Entry widget after a button is pressed in Tkinter?在 Tkinter 中按下按钮后如何清除 Entry 小部件?
【发布时间】: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()

【问题讨论】:

    标签: python user-interface widget tkinter


    【解决方案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')
                

                【讨论】:

                • 不,这绝对行不通。这会清除屏幕,而不是窗口中的小部件。
                • 这与问题无关。
                • 这与问题无关
                • 与问题无关
                猜你喜欢
                • 2022-01-11
                • 2018-09-19
                • 1970-01-01
                • 1970-01-01
                • 2022-06-18
                • 1970-01-01
                • 2011-09-09
                • 2019-01-04
                • 2013-04-28
                相关资源
                最近更新 更多