【问题标题】:Set tkinter Entry default value设置 tkinter 入口默认值
【发布时间】:2016-04-27 10:58:11
【问题描述】:

我正在开发一个脚本,它将在阅读 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

【问题讨论】:

  • 整个if..else 可能就是var = StringVar(value=arg.get('default', ''))
  • 简洁多了,谢谢,但我仍然有同样的问题......

标签: python tkinter default tkinter-entry


【解决方案1】:

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

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

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

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

【讨论】:

  • 太棒了,谢谢!不得不将第一行砍到 box = ttk.Entry(self.mainframe)
  • 荣誉。我永远不会猜到这与垃圾收集有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多