В моей программе переменной присваивается переменная tkinter, которая затем отслеживается:
self.tklon = tk.DoubleVar()
self.tklon.trace('w', self.trace_callback)
В графическом интерфейсе у меня есть Entry-виджет для хранения этой переменной:
self.lonEntry = tk.Entry(frame, textvariable = self.tklon)
В общем все работает. Но когда я удаляю содержимое записи для ввода нового значения, запись на короткое время пуста. Это все еще вызывает трассировку, и в результате я получаю следующее сообщение об ошибке:
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()
В моем случае это не причинит дополнительного вреда, но постоянные сообщения об ошибках в терминале раздражают.
Я думал, что может быть решение
а) Установка значения по умолчанию для записи, когда она пуста
б) Обновлять текстовую переменную, назначенную записи, можно только тогда, когда вы нажмете Enter на клавиатуре
но я не вижу таких опций для Entry-виджета. Я не могу думать ни о какой проверке достоверности, так как нет ничего более примитивного, чем .get(), который выдает ошибку...
Я просто пропустил нужную информацию? Есть ли другой обходной путь? Возможно, даже нет решения этой проблемы?
Спасибо за любую помощь, вы можете дать мне!
Проблема, как представляется, как природа textvariable
работает в Tkinter. Поэтому, когда значение изменяется в поле ввода, оно применяет любое значение к рассматриваемой переменной. Здесь это двойной. Проблема возникает, когда к этой переменной применяется значение, которое не является двойной совместимой строкой.
Когда вы используете get()
в DoubleVar()
, на самом деле происходит двойная DoubleVar()
которая пытается вернуть 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()
и проверить, является ли строка двойной или нет.
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()
trace_callback
? Можете ли вы изменить его, чтобы он возвращался, ничего не делая, если запись пуста?.bind('<Return>', func)
чтобы делать вещи, когда нажата клавиша Enter.func
будет передано событие, поэтому убедитесь, что у вас есть параметр