如何避免tkinter的IntVar.get()在空白字符串上引发TclError

时间:2018-10-09 00:51:40

标签: python tkinter

我有一个EntryIntVar绑定,但是调用my_int_var.get()会引发异常,似乎在抱怨该变量是一个空字符串。我只希望用户在该字段中输入整数。

除了捕获TclError以外,还有更好的解决方案吗?

这是我要避免的追溯:

|| Traceback (most recent call last):
||   File "Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
||     return self.func(*args)
||   File "/gui.py", line 172, in callback
||     print(f"Value is now: {my_int_var.get()}")
||   File "Python36-32\lib\tkinter\__init__.py", line 507, in get
||     return int(self._tk.getdouble(value))
|| _tkinter.TclError: expected floating-point number but got ""

这是在与my_int_var的{​​{1}}调用相关的回调中触发的。通过使用鼠标选择所有文本并按退格键来删除.trace()的内容时,会引发异常,并导致空白值。

这里有一些代码,您可以运行自己来重现该问题,而无需使用鼠标:

Entry

1 个答案:

答案 0 :(得分:0)

由于变量为空,您收到错误。您可以使用以下方法将初始值设置为0,以防止出现此错误:

var.set(0)

而且,您无需从条目中删除数据,因为创建条目时,该条目为空。因此删除行:

entry.delete(0, tk.END)

这是一个代码:

import tkinter as tk

root = tk.Tk()
var = tk.IntVar()
entry = tk.Entry(textvariable=var)
var.set(0)    #<--  Set the value to 0

var.get() #<-- Working

编辑:

您可以使用try / except语句。这是语句的工作:

import tkinter as tk

root = tk.Tk()
var = tk.IntVar()
entry = tk.Entry(textvariable=var)
entry.pack()
var.set(0)    #<--  Set the value to 0
def _get():
    try:var.get()
    except:var.set(0)

tk.Button(text="Press",command=_get).pack()
root.mainloop()
#var.get() #<-- Working

按下按钮时,如果条目为空,则其值将设置为0。