Tkinter команда выполняется раньше, чем запишется число

Вот есть виджет Label(e2), Entry(e1) и бинд к е1 с командой conv. Требуется чтобы пользователь ввёл данные в Entry и при нажатии любой кнопки значение е2 динамически менялось

from tkinter import*
from tkinter.ttk import Combobox

def callback(event):
    if cb1.get() == 'км' or cb1.get() == 'м' or cb1.get() == 'см':
        cb2['values'] = ("км", "м", "см")
    elif cb1.get() == 'кг' or cb1.get() == 'г':
        cb2['values'] = ("кг", "г")
    else:
        cb2['values'] = ("ч", "мин", "с")
    cb2.current(0)

def conv(event):
    x = int(e1.get())
    if cb1.get() == 'км' or cb1.get() == 'м' or cb1.get() == 'см':
        if cb1.get() == 'км':
            if cb2.get() == 'км':
                e2.config(text = x)
            elif cb2.get() == 'м':
                e2.config(text = x * 1000)
            else:
                e2.config(text = x * 100000)
        elif cb1.get() == 'м':
            if cb2.get() == 'км':
                e2.config(text = x / 1000)
            elif cb2.get() == 'м':
                e2.config(text = x)
            else:
                e2.config(text = x * 100)
        else:
            if cb2.get() == 'км':
                e2.config(text = x / 100000)
            elif cb2.get() == 'м':
                e2.config(text = x / 100)
            else:
                e2.config(text = x)
    elif cb1.get() == 'кг' or cb1.get() == 'г':
        if cb1.get() == 'кг':
            if cb2.get() == 'кг':
                e2.config(text = x)
            else:
                e2.config(text = x * 1000)
        else:
            if cb2.get() == 'кг':
                e2.config(text = x / 1000)
            else:
                e2.config(text = x)
    else:
        if cb1.get() == 'ч':
            if cb2.get() == 'ч':
                e2.config(text = x)
            elif cb2.get() == 'мин':
                e2.config(text = x * 60)
            else:
                e2.config(text = x * 3600)
        elif cb1.get() == 'мин':
            if cb2.get() == 'ч':
                e2.config(text = x / 60)
            elif cb2.get() == 'мин':
                e2.config(text = x)
            else:
                e2.config(text = x * 60)
        else:
            if cb2.get() == 'ч':
                e2.config(text = x / 3600)
            elif cb2.get() == 'мин':
                e2.config(text = x / 60)
            else:
                e2.config(text = x)

w = Tk()
w.title("Converter")
w.geometry('360x300')

t1 = Label(w, text = "Converter", font = ('Arial Bold', 30))
t1.grid()

t2 = Label(w,text = "from")
t2.grid()

e1 = Entry(w, width = 50)
e1.bind('<Key>', conv)
e1.grid()

cb1 = Combobox(w, width = 4, state = "readonly")
cb1['values'] = [
    "км",
    "м",
    "см",
    "кг", "г",
    "ч",
    "мин",
    "с"
    ]
cb1.current(0)
cb1.grid(column = 1, row = 2)
cb1.bind("<<ComboboxSelected>>", callback)

t2 = Label(w, text = 'to')
t2.grid()

e2 = Label(w, width = 40, bg = 'white')
e2.grid()

cb2 = Combobox(w, width=4, state = "readonly")
cb2['values'] = [
    "км",
    "м",
    "см"
    ]
cb2.current(1)
cb2.grid(column = 1, row = 4)

w.mainloop()

И выходит ошибка

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:/Program Files (x86)/Python38-32/ttt.py", line 15, in conv
    x = int(e1.get())
ValueError: invalid literal for int() with base 10: ''

Ответы (1 шт):

Автор решения: Danis

надо сделать проверку на то что e1.get() не пустой

def f():
    if e1.get() == "":
        return

либо проверять можно ли из него сделать число

def f():
    if not e1.get().isdigit():
        return
→ Ссылка