python - Tkinter Entry - 当字段为空时输入新值时出现错误消息

标签 python tkinter

在我的程序中,为一个变量分配了一个 tkinter 变量,然后对其进行跟踪:

self.tklon = tk.DoubleVar()
self.tklon.trace('w', self.trace_callback)

在 GUI 中,我有一个 Entry-widget 来保存此变量:

self.lonEntry = tk.Entry(frame, textvariable = self.tklon)

总的来说,一切正常。但是当我删除Entry的内容以输入新值时,Entry短暂为空。它仍然触发跟踪,因此,我收到以下错误消息:

File "xxxx", line 529, in get
    return self._tk.getdouble(self._tk.globalgetvar(self._name))
    _tkinter.TclError: expected floating-point number but got ""

trace_callback()函数中抛出错误消息的行是:

self.lon = self.tklon.get()

就我而言,它不会造成任何进一步的伤害,但终端中连续的错误消息很烦人。

我想可能有一个解决方案

a) 当 Entry 为空时设置默认值

b) 仅当您按键盘上的 Enter 时才更新分配给 Entry 的文本变量

但我没有在 Entry-widget 中看到任何此类选项。我想不出任何有效性检查,因为没有什么比 .get() 更原始的了,它会抛出错误......

我是否错过了正确的信息?还有其他解决方法吗?难道这个问题就没有解决办法吗?

感谢您给我的任何帮助!

最佳答案

问题似乎在于 textvariable 的本质如何在 tkinter 中工作。 因此,当输入字段中的值发生变化时,它将将该值应用于相关变量。这是一个双。当将不是 double 兼容字符串的值应用于该变量时,就会遇到问题。

当您在 DoubleVar() 中使用 get() 时,实际发生的情况是 double var 尝试返回 double。但是,空字符串无法转换为 double 型,因此会出错。

处理此问题的一种简单方法是使用 try/except 语句处理错误。

尝试这个想法:

import tkinter as tk


root = tk.Tk()
tklon = tk.DoubleVar()

def trace_callback(*args):
    try:
        print(tklon.get())
    except:
        print("value not a valid double")


lonEntry = tk.Entry(root, textvariable=tklon).pack()
tklon.trace('w', trace_callback)
root.mainloop()

或者,可能是更好的选择,您可以将 DoubleVar() 更改为 StringVar() 并测试字符串是否为 double 。

import tkinter as tk


root = tk.Tk()
tklon = tk.StringVar()
tklon.set(0.0)


def trace_callback(*args):
    if tklon.get().isdecimal():
        print("Do stuff with decimal")
    else:
        print("Value is not a decimal")


lonEntry = tk.Entry(root, textvariable=tklon).pack()
tklon.trace('w', trace_callback)
root.mainloop()

关于python - Tkinter Entry - 当字段为空时输入新值时出现错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150692/

相关文章:

python - 更改应用程序和任务栏图标 - Python/Tkinter

python - 将统计数据与变量一起使用

python - 删除目录下的文件/删除某个不为空的目录

python - 使用 Python 将代码直接导入脚本?

python - Mac 上 virtualenv 中的 Tkinter?

python-3.x - Python Tkinter:在放置place()d之后隐藏小部件

python - Django 休息框架 : Nested Serializer Dynamic Model Fields

python - pydot 和 graphviz 错误 : Couldn't import dot_parser, 无法加载点文件

python - 我正在尝试使用 tkinter import 在新窗口中逐字打印一些内容,但是当我通过终端运行它时,窗口不会弹出

python - 是否可以在 python tkcalendar 的日期中嵌入自定义文本