Tkinter Entry - сообщение об ошибке при вводе нового значения, когда поле пустое

1

В моей программе переменной присваивается переменная 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(), который выдает ошибку...

Я просто пропустил нужную информацию? Есть ли другой обходной путь? Возможно, даже нет решения этой проблемы?

Спасибо за любую помощь, вы можете дать мне!

  • 1
    Как выглядит определение trace_callback ? Можете ли вы изменить его, чтобы он возвращался, ничего не делая, если запись пуста?
  • 0
    используйте .bind('<Return>', func) чтобы делать вещи, когда нажата клавиша Enter. func будет передано событие, поэтому убедитесь, что у вас есть параметр
Показать ещё 6 комментариев
Теги:
tkinter

1 ответ

1

Проблема, как представляется, как природа 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()
  • 0
    Да, это похоже на правильный подход, спасибо! Я тоже попробую и посмотрю, что лучше в моем случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню