设置tkinter Entry默认值

时间:2016-04-27 10:58:12

标签: python tkinter default tkinter-entry

我正在开发一个脚本,它将在读取python脚本后自动构建GUI。我在获取我构建的Entry对象以接受默认值时遇到问题。

我向我的方法传递一个包含默认值和变量名的字典(arg)。

def create_entry(self,
                 arg):

    if 'default' in arg.keys():
        var = StringVar(value=arg['default'])
    else:
        var = StringVar()
    box = ttk.Entry(self.mainframe, textvariable=var)
    box.grid(column=1, row=self.num, columnspan=2, sticky=(W, E))
    label= ttk.Label(self.mainframe, text=arg['name']).grid(column=0, row=self.num, sticky=E)

    return box, label

我无法解释的是,查找目录的类似方法运行正常....

def create_askdirectory(self,
                        arg):

    if 'default' in arg.keys():
        var = StringVar(value=arg['default'])
    else:
        var = StringVar()
    box = ttk.Entry(self.mainframe, textvariable=var)
    box.grid(column=1, row=self.num, columnspan=2, sticky=(W, E))

    def askdirectory():
        dirname = filedialog.askdirectory()
        if dirname:
            var.set(dirname)

    button = ttk.Button(self.mainframe, text='directory', command=askdirectory).grid(column=0, row=self.num)

    return box, button

1 个答案:

答案 0 :(得分:1)

ttk小部件对垃圾收集比对tkinter小部件更敏感。您的变量(实际上并不需要)是局部变量,因此它们会被垃圾收集。

它在其他代码中工作的原因是askdirectory函数在create_askdirectory函数内部,因此它能够看到局部变量。

我的建议是使用StringVar - 在这种情况下,它们完全没必要。

box = ttk.Entry(self.mainframe)
box.insert(0, arg.get("default", "")
相关问题