Исключение в обратном вызове Tkinter, _tkinter.TclError: ожидаемое целое число, но получено "" - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь создать ряд виджетов Entry, которые добавляют числовые c значения и вводят итог в крайний левый столбец. Я могу создать кодовую функцию, но она выдает исключение каждый раз, когда я пытаюсь использовать метод 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 ""

Я понятия не имею, почему это происходит, и мне нужна помощь в том, что делать!

1 Ответ

1 голос
/ 20 июня 2020

Как сказано в моем комментарии , , когда вы возвращаете все в поле ввода, значение равно "", которое затем пытается сохранить в IntVar() и, как мы знаем, IntVar() не может иметь строковое значение, это может быть либо 0, либо любое другое целое число. Итак, чтобы исправить это, нам сначала нужно принять только целые значения от пользователя. См. Этот ответ , чтобы понять, как это сделать.

Я изменил ваш код и сделал его более оптимизированным, ограничив ввод только целыми числами и проверив, является ли какой-либо виджет 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...