Как избежать IntVar.get () tkinter, вызывающих TclError для пустых строк - PullRequest
0 голосов
/ 09 октября 2018

У меня Entry привязано к IntVar, но при вызове 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 ""

Это срабатывает при обратном вызове, связанном с .trace() *1013*.Исключение выдается, когда вы удаляете содержимое Entry, выделяя мышью весь текст и нажимая клавишу Backspace, что приводит к пустому значению.

Вот код, который вы можете запустить самостоятельно, чтобы воспроизвести проблему, без использования мыши:

import tkinter as tk

root = tk.Tk()
my_int_var = tk.IntVar()

entry = tk.Entry(textvariable=my_int_var)
entry.delete(0, tk.END)

my_int_var.get() #throws TclError

1 Ответ

0 голосов
/ 09 октября 2018

Вы получаете ошибку, потому что переменная пуста.Вы можете установить начальное значение на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...