使用 destroy() 从 Tkinter 中的网格中删除一个条目框

Deleting an Entrybox from grid in Tkinter with destroy()

我在 Tkinter 中有一个树视图,双击 id 列中的一个项目(不是顶层项目),我添加了一个 entry widget。如果我双击另一个项目,我想删除原来的entry widget。我正在尝试使用 entry.destroy()try 语句来执行此操作,这样我第一次双击时就不会出错。 destroy() 函数似乎什么都不做。

from Tkinter import *
import ttk

root = Tk()

def OnDoubleClick(event):
    try:
        entry.destroy()

    except:
        entry_text = StringVar()
        entry = Entry(root, textvariable=entry_text)

        entry.configure(background='#d3d3d3')
        rowid = tree.identify_row(event.y)
        column = tree.identify_column(event.x)
        # clicked row parent id
        parent = tree.parent(rowid)

        # do nothing if item is top-level
        if parent == '':
            return
        #get column position info
        x,y,width,height = tree.bbox(rowid, column)
        print x,y,width,height


        if column == '#0':
            entry.place( x=x, y=y+height // 2, anchor=W, width=width)
            entry_text.set(tree.set(tree.identify_row(event.y)))
        print tree.set(tree.identify_row(event.y))

tree = ttk.Treeview(root)

tree["columns"]=("one","two")
tree.heading("one", text="coulmn A")
tree.heading("two", text="column B")

tree.insert("", 3, "dir3", text="Dir 3",values=("3A"," 3B"))
tree.insert("dir3", 3, 'subdir3', text="sub dir 3",values=("3A"," 3B"))
tree.insert("dir3", 3, 'subdir5', text="sub dir 4",values=("3A"," 3B"))
tree.bind("<Double-1>", OnDoubleClick)


tree.pack()
root.mainloop()

添加一个测试以查看条目是否存在(常见的调试测试),显示条目不存在。 Hint=它与条件 place 语句有关,这也意味着它是函数的本地函数和函数退出时收集的垃圾(永远不会添加到确实保留的根)。

from Tkinter import *
import ttk

root = Tk()

def OnDoubleClick(event):
    try:
        print "entry =", entry
    except:
        print "-----entry does not exist-----"

    try:
        entry.destroy()

    except:

        entry_text = StringVar()
        entry = Entry(root, textvariable=entry_text)

        entry.configure(background='#d3d3d3')
        rowid = tree.identify_row(event.y)
        column = tree.identify_column(event.x)
        # clicked row parent id
        parent = tree.parent(rowid)

        # do nothing if item is top-level
        if parent == '':
            return
        #get column position info
        x,y,width,height = tree.bbox(rowid, column)
        print x,y,width,height


        if column == '#0':
            entry.place( x=x, y=y+height // 2, anchor=W, width=width)
            entry_text.set(tree.set(tree.identify_row(event.y)))
        print tree.set(tree.identify_row(event.y))

tree = ttk.Treeview(root)

tree["columns"]=("one","two")
tree.heading("one", text="coulmn A")
tree.heading("two", text="column B")

tree.insert("", 3, "dir3", text="Dir 3",values=("3A"," 3B"))
tree.insert("dir3", 3, 'subdir3', text="sub dir 3",values=("3A"," 3B"))
tree.insert("dir3", 3, 'subdir5', text="sub dir 4",values=("3A"," 3B"))
tree.bind("<Double-1>", OnDoubleClick)


tree.pack()
root.mainloop()

Python认为entry是局部变量。因为你试过了,所以你没有看到它给出的错误,类似于 UnboundLocalError: local variable 'entry' referenced before assignment