在我的程序中,为一个变量分配了一个 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/