Конвертировать в TKInter поле Entry в int
Пытаюсь написать простой конвертор который принимает ввод Entry число и при нажатии на кнопку расчет делает расчет по формуле. Без get не переводит в int, но как только я привязываю get из окна программы пропадают все поля ввода. Есть у кого-то какие-то идеи как это победить?
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Конвертор")
root.geometry("700x600")
class Window(Tk):
def __init__(self):
super().__init__()
def new_window():
window = Tk()
window.title("Листы в киллограммы")
window.geometry("700x600")
label0 = ttk.Label(window, text="Листы в кг.")
label0.pack(anchor="center", padx=20, pady=10)
label1 = ttk.Label(window, text="Ширина листа в мм. : ")
label1.pack(anchor="center", padx=20, pady=10)
entry_width = ttk.Entry(window)
entry_width.pack(anchor="center", padx=20, pady=10)
width = entry_width.get()
int_width = int(width)
label2 = ttk.Label(window, text="Длинна листа в мм. : ")
label2.pack(anchor="center", padx=20, pady=10)
entry_height = ttk.Entry(window)
entry_height.pack(anchor="center", padx=20, pady=10)
height = entry_height.get()
int_height = int(height)
label3 = ttk.Label(window, text="Масса листа в граммах : ")
label3.pack(anchor="center", padx=20, pady=10)
entry_mass = ttk.Entry(window)
entry_mass.pack(anchor="center", padx=20, pady=10)
mass = entry_mass.get()
int_mass = int(mass)
label4 = ttk.Label(window, text="Количество листов в шт. : ")
label4.pack(anchor="center", padx=20, pady=10)
entry_sheets = ttk.Entry(window)
entry_sheets.pack(anchor="center", padx=20, pady=10)
sheet = entry_sheets.get()
int_sheets = int(sheet)
label5 = ttk.Label(window, text="ИТОГО")
label5.pack(anchor="center", padx=20, pady=10)
def calc_1():
answer = int_width * int_height * int_mass * int_sheets
label5.config(text=answer)
btn_calculated = ttk.Button(window, text="Рассчет", command=calc_1)
btn_calculated.pack(anchor="center", padx=20, pady=10)
btn_win1 = ttk.Button(text="Листы в киллограммы", command=new_window)
btn_win1.pack(anchor="center", padx=20, pady=10)
root.mainloop()
Ответы (1 шт):
entry_width = ttk.Entry(window)
entry_width.pack(anchor="center", padx=20, pady=10)
width = entry_width.get()
int_width = int(width) # Ошибка здесь
entry_height = ttk.Entry(window)
entry_height.pack(anchor="center", padx=20, pady=10)
height = entry_height.get()
int_height = int(height) # И здесь
entry_mass = ttk.Entry(window)
entry_mass.pack(anchor="center", padx=20, pady=10)
mass = entry_mass.get()
int_mass = int(mass) # И здесь
entry_sheets = ttk.Entry(window)
entry_sheets.pack(anchor="center", padx=20, pady=10)
sheet = entry_sheets.get()
int_sheets = int(sheet) # И здесь
Вы пытаетесь преобразовать значения полей ввода в целые числа сразу после их создания. Но в этот момент поля ввода еще пусты, поэтому entry_width.get(), entry_height.get(), entry_mass.get() и entry_sheets.get() возвращают пустую строку, которую нельзя преобразовать в целое число. Это вызывает ошибку. Преобразование в целые числа должно происходить после того, как пользователь введет данные и нажмет кнопку “Рассчет”.
Вот исправленный код:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Конвертор")
root.geometry("700x600")
class Window(Tk):
def __init__(self):
super().__init__()
def new_window():
window = Tk()
window.title("Листы в киллограммы")
window.geometry("700x600")
label0 = ttk.Label(window, text="Листы в кг.")
label0.pack(anchor="center", padx=20, pady=10)
label1 = ttk.Label(window, text="Ширина листа в мм. : ")
label1.pack(anchor="center", padx=20, pady=10)
entry_width = ttk.Entry(window)
entry_width.pack(anchor="center", padx=20, pady=10)
label2 = ttk.Label(window, text="Длинна листа в мм. : ")
label2.pack(anchor="center", padx=20, pady=10)
entry_height = ttk.Entry(window)
entry_height.pack(anchor="center", padx=20, pady=10)
label3 = ttk.Label(window, text="Масса листа в граммах : ")
label3.pack(anchor="center", padx=20, pady=10)
entry_mass = ttk.Entry(window)
entry_mass.pack(anchor="center", padx=20, pady=10)
label4 = ttk.Label(window, text="Количество листов в шт. : ")
label4.pack(anchor="center", padx=20, pady=10)
entry_sheets = ttk.Entry(window)
entry_sheets.pack(anchor="center", padx=20, pady=10)
label5 = ttk.Label(window, text="ИТОГО")
label5.pack(anchor="center", padx=20, pady=10)
def calc_1():
width = entry_width.get()
height = entry_height.get()
mass = entry_mass.get()
sheet = entry_sheets.get()
if width and height and mass and sheet:
int_width = int(width)
int_height = int(height)
int_mass = int(mass)
int_sheets = int(sheet)
answer = int_width * int_height * int_mass * int_sheets
label5.config(text=answer)
else:
label5.config(text="Пожалуйста, заполните все поля.")
btn_calculated = ttk.Button(window, text="Рассчет", command=calc_1)
btn_calculated.pack(anchor="center", padx=20, pady=10)
btn_win1 = ttk.Button(text="Листы в киллограммы", command=new_window)
btn_win1.pack(anchor="center", padx=20, pady=10)
root.mainloop()