Tkinter виджет Entry, преобразование в int
Всем привет. Пишу калькулятор, логика в консоли вся работает, но при работе с библиотекой я натыкаюсь на ошибки. Пожалуйста, помогите понять и исправить
from tkinter import *
window = Tk()
message = StringVar()
input = Entry(window, textvariable = message)
input.grid(row = 1, column = 1)
result = 0
n = 0
numbs = [0, 0]
loop = True
def vvod(n, numbs):
a = int(message.get())
numbs[n] = a
n =+ 1
return(n, numbs)
btnok = Button(window, Text = "Ввод", command = vvod(n, numbs))
btnok.grid(row = 2, column = 1)
def summury (loop, result, n, numbs):
while(loop):
vvod(n, numbs)
loop = False
result = sum(numbs)
n = 0
numbs = [0, result]
return(result, n, numbs)
abtnplus = Label(window, Text = "+", command = summury(loop, result, n, numbs))
abtnplus.grid(row = 2, column = 1)
def minus (loop, result, n, numbs):
while(loop):
vvod(n, numbs)
loop = False
result = sum(numbs)
n = 0
numbs = [0, result]
return(result, n, numbs)
abtnplus = Label(window, Text = "+", command = summury(loop, result, n, numbs))
abtnplus.grid(row = 2, column = 1)
def result(result):
resultlable = Label(window, Text = result)
resultlable.grid(row = 3, column = 3)
window.mainloop()
Сама ошибка:
Traceback (most recent call last):
File "D:/1111/main.py", line 16, in <module>
btnok = Button(window, Text = "Ввод", command = vvod(n, numbs))
File "D:/1111/main.py", line 12, in vvod
a = int(message.get())
ValueError: invalid literal for int() with base 10: ''
Ответы (1 шт):
Тут не происходит привязка функции на нажатие кнопки, а происходит сразу вызов функции vvod, в итоге функция вызывается когда в полях ввода еще пусто:
btnok = Button(window, Text = "Ввод", command = vvod(n, numbs))
Чтобы функция вызывалась в момент нажатия на кнопку, нужно завернуть в лямбду:
btnok = Button(window, text = "Ввод", command = lambda: vvod(n, numbs))
Также обратите внимание, что регистр в имен переменных (параметров в данном случае) имеет значение: должно быть text, а не Text.
Если функции не нужны никакие дополнительные параметры, то можно в command предавать просто функцию без скобок, но если вы добавляете скобки - то это уже будет вызовом функции, а не ссылкой на функцию.
Также, в таких строках:
abtnplus = Label(window, text = "+", command = summury(loop, result, n, numbs))
у Label нет параметра command (т.к. это не кнопка), поэтому будет на это ругаться.
Если нужна реакция на клик по Label, нужно использовать bind:
abtnplus = Label(window, text = "+")
abtnplus.bind('<1>', lambda event: summury(loop, result, n, numbs))