【问题标题】:how to delete many tkinter entries together如何一起删除许多 tkinter 条目
【发布时间】:2021-02-11 12:30:26
【问题描述】:

我有许多名为 idn1 到 idn5 的 tkinter 条目,而不是重复相同的条目 删除每个条目的功能我尝试了以下与visual basic但不是python相得益彰的方法:

def deleteme():
    
    idn = ""
    i = 1
    while True:
    
        idn ="idn"+str(i)+".delete(0,END)"
        
        i += 1
        idn
        
        if i == 6:
            break
    return True

root = Tk()

root.geometry('{}x{}'.format(460, 350))

idn1 = Entry(root).grid(row =0,column=1)

idn2 = Entry(root).grid(row =1,column=1)

idn3 = Entry(root).grid(row =2,column=1)

idn4 = Entry(root).grid(row =3,column=1)

idn5 = Entry(root).grid(row =4,column=1)

btn1 = Button(root,command = deleteme)

root.mainloop()  

【问题讨论】:

  • Does this help you? 另外,作为替代方案:将对象存储在数组/列表中怎么样?然后你可以迭代它们。
  • 谢谢,我以前试过这个,但没用
  • 将小部件保留在列表中,然后您只需for-loop 即可删除它们。在当前版本中,您可以创建像 "idn0.delete(0,END)" 这样的字符串,但对于 Python,它只是字符串,仅此而已。它不会将其作为命令运行。您需要使用eval("idn0.delete(0,END)"),但这不是首选。还有其他方法。将项目保留在列表或字典中并使用for-loop

标签: python tkinter tkinter-entry


【解决方案1】:

您可以创建像 "idn0.delete(0,END)" 这样的字符串,但对于 Python,它只是字符串,仅此而已。它不会将其作为命令运行。您需要使用eval("idn0.delete(0,END)") 来执行此字符串中的命令,但eval() 不是首选方法。

您应该将小部件保留在列表或字典中,然后您可以使用for-loop 删除所有项目。


但还有其他非常常见的错误

使用

variable = Widget().grid()

您将None 分配给variable,因为grid()/pack()/place() 返回None

你必须分两步完成

variable = Widget()
variable.grid()

最少的工作代码

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---
 
def deleteme():
    
    for item in widgets:
        item.delete(0, 'end')
        
# --- main ---

widgets = []

root = tk.Tk()

for number in range(5):
    variable = tk.Entry(root)
    variable.grid(row=number, column=1)
    widgets.append(variable)
    
btn1 = tk.Button(root, text='Delete', command=deleteme) # PEP8: inside `()` use space after comma `,` but without spaces around `=`
btn1.grid(row=5, column=1)

root.mainloop() 

字典也一样

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---
 
def deleteme():
    
    for name, item in widgets.items():
        item.delete(0, 'end')
        
# --- main ---

widgets = {}

root = tk.Tk()

for number in range(1, 6):
    variable = tk.Entry(root)
    variable.grid(row=number, column=1)
    widgets[f"idn{number}"] = variable
    
btn1 = tk.Button(root, text='Delete', command=deleteme) # PEP8: inside `()` use space after comma `,` but without spaces around `=`
btn1.grid(row=5, column=1)

root.mainloop() 

当然,您可以在不使用for-loop 的情况下手动添加小部件,但这很长而且很无聊,所以我跳过了一些小部件。但即使我跳过或添加小部件,我也不必更改 deleteme() 中的代码

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---
 
def deleteme():
    
    for name, item in widgets.items():
        item.delete(0, 'end')
        
# --- main ---

widgets = {}

root = tk.Tk()

variable = tk.Entry(root)
variable.grid(row=0, column=1)
widgets["idn1"] = variable

# or 

widgets["idn2"] = tk.Entry(root)
widgets["idn2"].grid(row=1, column=1)
    
widgets["idn3"] = tk.Entry(root)
widgets["idn3"].grid(row=2, column=1)
    
# etc.    
    
btn1 = tk.Button(root, text='Delete', command=deleteme) # PEP8: inside `()` use space after comma `,` but without spaces around `=`
btn1.grid(row=5, column=1)

root.mainloop() 

【讨论】:

  • 非常感谢,您的回答对我很有帮助,感谢您的真诚帮助,它解决了我的应用程序中的许多问题,给了我很大的推动力,再次感谢您。
【解决方案2】:

假设您的 UI 设计支持它,最简单的解决方案是将所有条目小部件放在一个框架中。然后您可以删除该框架,它的所有子框架都将被自动删除。

entry_frame = Frame(root)
idn1 = Entry(entry_frame).grid(row =0,column=1)
idn2 = Entry(entry_frame).grid(row =1,column=1)
idn3 = Entry(entry_frame).grid(row =2,column=1)
idn4 = Entry(entry_frame).grid(row =3,column=1)
idn5 = Entry(entry_frame).grid(row =4,column=1)
...
# this destroys the frame and all of its children
entry_frame.destroy()

如果您不能这样做或不想这样做,下一个最佳解决方案是将小部件存储在列表中。

例如,您可以像这样在列表中创建它们:

entries = []
for row in range(5):
    entry = Entry(root)
    entry.grid(row=row, column=1)
    entries.append(entry)

当然,您不必循环创建它们。如果小部件基本相同,那效果很好。如果每个都需要是唯一的,请单独创建然后将它们附加到列表中。

idn1 = Entry(root)
idn2 = Entry(root)
idn3 = Entry(root)
idn4 = Entry(root)
idn5 = Entry(root)
entries = [idn1, idn2, idn3, idn4, idn5]

注意:无论您选择哪种方法,都必须将对grid 的调用放在单独的语句中。按照您编写原始代码的方式,您的所有入口变量都将设置为 None,因为这是 grid 返回的内容。

无论您如何创建列表,都可以通过遍历列表来删除它们:

for entry in entries:
    entry.destroy()

【讨论】:

  • 真的谢谢你,我也试过你的建议,发现它在每个小部件的唯一性方面非常有用。
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多