不了解使用 tkinter 回调 lambda 的 python 错误



我在 tkinter 回调中使用了 lambda。 它产生正确的结果,但抛出错误。 我不理解的错误,也无法隔离和消除。 目标是通过条目小部件获取两个用户输入,第二个有跟踪。 跟踪采用两个 Entry 小部件并计算返回该值的标记 (100*((var1-var2(/var2((。 表单正确显示标记,但我也收到错误,我想消除该错误。 该错误指示它正在等待双变量并得到"。 所有三个变量都是 DoubleVar (var1, var2, mu(。 我归结于它与自我有关,但我不够了解,无法到达终点线。 任何建议或指示将不胜感激。

from tkinter import *
def var2_callback(var1, var2, mu):
#print('var1: %d' % var1.get())
#print('var2: %d' % var2.get())
#print('mu: %d' % mu.get())
markup = var1.get() * var2.get()
mu.set(markup)
#print('times: %d' % mu.get())
return()

def do_something():
mu = DoubleVar(value=0)
root.grid_columnconfigure((0,1,2,3,4,5), weight=1)
root.grid_rowconfigure((0,1,2,3,4,5,6,7,8,9,10), weight=1)
cf = Frame(root)
cf.grid(row=0, column=2)
lbl1 = Label(cf, textvariable=mu)
lbl1.grid(row=0, column=2)
var1 = DoubleVar(value=0)
e1 = Entry(cf, textvariable=var1)
e1.grid(row=2, column=2)
var2 = DoubleVar(value=0)
var2.trace('w',lambda name, index, mode, var2=var2: var2_callback(var1,var2,mu))
e2 = Entry(cf, textvariable=var2)
e2.grid(row=3, column=2)

root = Tk()
root.geometry("1000x600+0+0")
do_something()
root.mainloop()

我得到的错误是:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
return self.func(*args)
File "for_entry.py", line 28, in <lambda>
var2.trace('w',lambda name, index, mode, mu=mu: var2_callback(var1,var2,mu))
File "for_entry.py", line 7, in var2_callback
markup = var1.get() * var2.get()
File "/usr/lib/python3.6/tkinter/__init__.py", line 529, in get
return self._tk.getdouble(self._tk.globalgetvar(self._name)_tkinter.TclError: expected floating-point number but got ""

我想消除错误。 我知道如果我注释掉 mu.set 行,我可以消除错误(和 mu 计算...... 我不明白我在传递 mu 结果时违反了什么规则。

***更新

问题是有些跟踪回调是如何调用两次的。 即使 var2 设置为 0,var2 第一次为空。 第二次通过它工作。 试图弄清楚为什么 var2 在第一次通过时是空的。 我已经通过在回调函数的开头添加 print 语句来验证这一点。 我试图通过在回调函数的开头设置 var2 (var2.set(0(( 来避免这个问题 - 这避免了这个问题,但显然会阻止函数进行计算。 我不知道如何使用"if"语句来测试 var2。 'if var2.get(( == None: 或者 var2.get(( != None 或 var2.get((> 0' 都会导致与 var2 相同的错误,即 var2 是 '' 并且应该是 DoubleVar。 此问题是由使用函数而不是类引起的吗?

感谢您 acw1668 为我指出能够使用 try/except 掩盖问题的方向。 这使我可以在跟踪上隐藏错误。 跟踪在小数点上触发(如 .5(,这创建了一个非法计算(. 乘以某些事情毫无意义(。 这反过来又导致我在事件而不是变量上使用绑定(在 Tab 键、向上箭头、向下箭头上绑定(,效果要好得多。

最新更新