【问题标题】:Exception in Tkinter callback, _tkinter.TclError: expected integer but got ""Tkinter 回调中的异常,_tkinter.TclError:预期的整数但得到“”
【发布时间】:2020-06-19 20:38:55
【问题描述】:

我正在尝试制作一行输入小部件,这些小部件将数值相加并将总数输入到最左侧的列中。我能够使代码起作用,但是每当我尝试在变量类上使用 get() 方法时,它都会引发异常。这是一个例子:

from tkinter import *

root = Tk()

ent1 = IntVar()
ent2 = IntVar()
ent3 = IntVar()


def callback(*args):
    ent1.set(ent2.get() + ent3.get())


frame = Frame(root)
frame.pack()

entry1 = Entry(frame, width=5, textvariable=ent1)
entry2 = Entry(frame, width=5, textvariable=ent2)
entry3 = Entry(frame, width=5, textvariable=ent3)

entry1.pack(side=LEFT)
entry2.pack(side=LEFT)
entry3.pack(side=LEFT)

ent1.trace_add('write', callback)
ent2.trace_add('write', callback)
ent3.trace_add('write', callback)

root.mainloop()

这里是个例外:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Paul Desktop\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 508, in get
    return self._tk.getint(value)
_tkinter.TclError: expected integer but got ""

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Paul Desktop\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/Paul Desktop/PycharmProjects/Pathfinder Character Sheet/EntryTest.py", line 15, in callback
    ent1.set(ent2.get() + ent3.get())
  File "C:\Users\Paul Desktop\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 510, in get
    return int(self._tk.getdouble(value))
_tkinter.TclError: expected floating-point number but got ""

我不知道为什么会发生这种情况,我可以寻求帮助!

【问题讨论】:

  • 好吧,当你退格输入框上的所有内容时,值是"",然后它会尝试保存到IntVar(),并且我们知道它不能有字符串值0或整数。
  • 确保永远不会发生的最佳方法是什么?
  • 永远不要让输入框有""除整数值之外的任何其他值

标签: python tkinter callback


【解决方案1】:

就像在我的comment 中所说的那样,当您退格输入框中的所有内容时,值是 "",然后它会尝试保存到 IntVar(),并且我们知道 IntVar() 不能有字符串值,它可以是 0 或任何其他整数。 所以要解决这个问题,我们首先需要只接受来自用户的整数值。请参阅此answer 以了解如何执行此操作。

我已更改您的代码并使其更加优化,将输入限制为仅整数,并检查任何 Entry 小部件是否为空我们可以避免所有这些错误。

完整代码:

from tkinter import *

def callback(text, wid):
    if str.isdigit(text) or not text:
        text = text if text else 0
        if wid == str(entry3):
            n = entry2.get() if entry2.get() else 0
        if wid == str(entry2):
            n = entry3.get() if entry3.get() else 0
        ent1.set(int(n) + int(text))
        return True
    return False

root = Tk()

ent1 = IntVar()

vcmd = (root.register(callback), '%P', '%W')
frame = Frame(root)
frame.pack()

entry1 = Entry(frame, width=5, textvariable=ent1)
entry2 = Entry(frame, width=5, validate='all', validatecommand=vcmd)
entry3 = Entry(frame, width=5, validate='all', validatecommand=vcmd)

entry1.pack(side=LEFT)
entry2.pack(side=LEFT)
entry3.pack(side=LEFT)

root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多