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