检查条目的值后删除tkinter小部件(初学者)

时间:2016-05-25 23:18:13

标签: python python-2.7 tkinter widget trace

我是一个初学者,试图编写一个程序,根据条目的值添加或删除小部件(checkbutton)。例如,如果条目大于1,则会添加复选框,否则程序将删除该复选框。

我的代码会创建小部件,但在更改条目后不会删除它,我无法弄明白。你能帮帮我吗?

提前感谢您的帮助!

这是我的代码的简短示例:

from Tkinter import *

root = Tk()

def update(*args):
    print EntryVar.get()

    if EntryVar.get()>'1':
        cb = Checkbutton(root,text="Show check box")
        cb.grid(row = 1)

    elif EntryVar.get()<='1' or EntryVar.get() == '':
        try:
            cb.grid_remove()
        except:
            pass

EntryVar = StringVar()
EntryVar.trace('w',update)
Entry = Entry(root,textvariable = EntryVar)
Entry.grid(row = 0)


root.mainloop()

如果您需要更多详细信息,请与我们联系:)

1 个答案:

答案 0 :(得分:0)

一个问题是cb在try:下是“未解决的”,一旦你声明它是全局的,它就会像你想要的那样“表现”:

from Tkinter import *

root = Tk()

def update(*args):
    print EntryVar.get()
    global cb
    if EntryVar.get()>'1':
        cb = Checkbutton(root,text="Show check box")
        cb.grid(row = 1)

    elif EntryVar.get()<='1' or EntryVar.get() == '':
        try:
            cb.grid_remove()

        except:
            pass

EntryVar = StringVar()
EntryVar.trace('w',update)
Entry = Entry(root,textvariable = EntryVar)
Entry.grid(row = 0)


root.mainloop()

但即便如此,在获取Entry值时您将面临另一个挫折,因为字符串按字典顺序进行比较,并且不同类型通过其类型名称进行比较,此问题已被提出here

另一点,如果您撤消异常处理,您将看到如果用户键入0或1,您的程序将与"NameError: name 'cb' is not defined"崩溃,因为您的检查按钮不存在(未定义)且没有任何要删除的内容,如果在函数的初始化时定义了检查按钮,则在尝试grid_remove()或delete()时不会删除它。此外,当您输入非数字字符串时,您的程序将没有所需的行为。考虑更改您正在使用的逻辑和var类型。 还要注意,当if EntryVar.get() > '2':(你可以玩这个)时,行为会发生变化,所以肯定会有一些与逻辑有关的东西。