Ошибка значения: недопустимый литерал для int () с основанием 10: » произошло, и я перепробовал все, чтобы это исправить

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я пытался сделать это весь день, я создаю графический интерфейс с помощью tkinter, но я не могу преобразовать Entry() в int, я перепробовал почти все и до сих пор не могу это исправить.

Это код:

 from tkinter import *

root = Tk()

root.title("Calculator")
root.configure(bg="#E1E1E1")

# left side labels
l1 = Label(root, text="PD>", bg="#E1E1E1")
l1.grid(row=0, column=0)

l2 = Label(root, text="P1>", bg="#E1E1E1")
l2.grid(row=2, column=0)

l3 = Label(root, text="P2>", bg="#E1E1E1")
l3.grid(row=3, column=0)

l4 = Label(root, text="RD>", bg="#E1E1E1")
l4.grid(row=1, column=0)

# inputs
e = Entry(root, width=25, borderwidth=2, bg="#F0F0F0")
e.grid(row=0, column=1, columnspan=2, padx=10, pady=10)

c = Entry(root, width=25, borderwidth=2, bg="#F0F0F0")
c.grid(row=1, column=1, columnspan=2, padx=10, pady=10)

p1 = Entry(root, width=25, borderwidth=2, bg="#F0F0F0")
p1.grid(row=2, column=1, columnspan=2, padx=10, pady=10)

p2 = Entry(root, width=25, borderwidth=2, bg="#F0F0F0")
p2.grid(row=3, column=1, columnspan=2, padx=10, pady=10)

l5 = Label(root, text=" ", bg="#E1E1E1", pady=20)
l5.grid(row=4, column=1)

# Descriptions
l6 = Label(root, text="PD = Piston Diameter, Bore;", bg="#E1E1E1")
l6.grid(row=6, column=1, rowspan=1)

l7 = Label(root, text="RD = Rod Diameter, Rod;", bg="#E1E1E1")
l7.grid(row=7, column=1, rowspan=1)

l8 = Label(root, text="P1 = Pressure, Push;", bg="#E1E1E1")
l8.grid(row=8, column=1, rowspan=1)

l9 = Label(root, text="P2 = Pressure, Traction;", bg="#E1E1E1")
l9.grid(row=9, column=1, rowspan=1)

l10 = Label(root, text="mm", bg="#E1E1E1")
l10.grid(row=0, column=2)

l11 = Label(root, text="mm", bg="#E1E1E1")
l11.grid(row=1, column=2)

l12 = Label(root, text="Mpa", bg="#E1E1E1")
l12.grid(row=2, column=2)

l13 = Label(root, text="Mpa", bg="#E1E1E1")
l13.grid(row=3, column=2)

#getting the input 
mp1 = p1.get()
mp2 = p2.get()
me = e.get()
mc = c.get()

mmp1 = int(float(mp1))
mmp2 = int(float(mp2))
mme = int(float(me))
mmc = int(float(mc))

P = ((mmp1 * (mme * mme) * 3.14) / 4) / 1000
R = (mmp2 * ((mme ** 2) - ((mmc ** 2)) * (3.14 / 4)) / 1000

#buttons
def ClickP():
    LP = Label(root, text=(P), bg="#E1E1E1")
    LP.grid(row=5, column=1)


def ClickR():
    LR = Label(root, text=(R), bg="#E1E1E1")
    LR.grid(row=5, column=2)


BP = Button(root, text="P Force", padx=40, pady=20, command=ClickP)
BR = Button(root, text="R Force", padx=40, pady=20, command=ClickR)

BP.grid(row=4, column=1, columnspan=2)
BR.grid(row=4, column=2, columnspan=2)

root.mainloop()
 

Еще не закончил, я собирался поработать над кнопками, протестировал его и получил эту ошибку:

 ValueError: invalid literal for int() with base 10
 

Надеюсь, я скоро найду решение. У меня были похожие ошибки, когда я менял такие вещи, как:

 ValueError: could not convert string to float: ''
 

или не удается умножить строки. Не знаю, что еще попробовать.

Комментарии:

1. Для какой строки вы получаете ошибку?

2. mmp1 = int(float(mp1)) этот

3. И что это значит could not convert string to float: '' , когда у вас есть float(mp1) ?

4. он не смог преобразовать его в float, потому что входная строка ''

5. p1, p2, e amp; c все они считываются get еще до отображения графического интерфейса. Получение содержимого записей должно быть в функции обратного вызова, вероятно, вызываемой при нажатии кнопки. Записи могут быть инициализированы значением ‘0’ или функцией преобразования, которая возвращает 0 для «» (пустой строки), созданной.

Ответ №1:

Вы также можете использовать этот for цикл, чтобы увидеть, где возникают / возникают проблемы:

 mp1 = p1.get()
mp2 = p2.get()
me = e.get()
mc = c.get()

lst = [mp1, mp2, me, mc]
for m in lst:
    try:
        m = int(float(m))
    except:
        print(f"Can't convert {m} into a float.")
 

Приведенный выше цикл сообщит вам, какая из четырех строк не может быть преобразована в число с плавающей запятой.

Примечание: except Оператор, используемый выше, слепо примет любую ошибку и перейдет к печати. Если вы хотите, чтобы он печатался только при ValueError возникновении, сделайте это вместо этого:

 for m in lst:
    try:
        m = int(float(m))
    except ValueError:
        print(f"Can't convert {m} into a float.")
 

Комментарии:

1. Не удается преобразовать в значение с плавающей точкой. Это то, что было сказано 4 раза, я предполагаю, что ни один из них не может преобразовать

2. @xKnify Это означает, что каждый элемент в списке представляет собой пустые строки, '' .

3. да, поскольку он открывает графический интерфейс, в котором вам нужно вводить входные данные. Как я могу это исправить? Вы знаете способ

4. @xKnify Вы имеете в виду lst = [mp1, mp2, me, mc] into lst = [input(), input(), input(), input()] ?

5. предполагается, что запись tkinters открывает графический интерфейс, в котором вы вводите внутри поля ввода, затем команда .get получает информацию из этого поля, но поскольку возникает ошибка, графический интерфейс не открывается, поэтому для входных строк нет значения. Idk, вероятно, я делаю что-то не так. Вроде как новичок в python

Ответ №2:

Вы получаете эту ошибку, потому что сделанные вами записи пусты в тот момент, когда вы вызываете get() для них функцию.

Представьте Entry себе текстовое поле, в котором пользователь может что-то заполнить. По умолчанию это текстовое поле будет пустым, и вы сможете позже заполнить его чем-нибудь после запуска приложения.

Это означает, что при запуске

 #getting the input 
mp1 = p1.get()
mp2 = p2.get()
me = e.get()
mc = c.get()
 

Python просто извлекает пустые поля '' каждой из ваших записей, которые, конечно, не могут быть преобразованы в число, поскольку оно пустое.

Итак, как вы это решаете? Ну, это зависит в основном от того, чего вы пытаетесь достичь.

Вариант 1

Вы могли бы определить значение по умолчанию для записей, которые будут храниться при создании. Это можно сделать с помощью insert() функции. Пример (для вашей первой записи) будет примерно таким

 e = Entry(root, width=25, borderwidth=2, bg="#F0F0F0")
e.insert(END, '0')  # Here, I set zero as the default value for your entry
e.grid(row=0, column=1, columnspan=2, padx=10, pady=10)
 

Вариант 2

Вы определяете резервное поведение при преобразовании в int . Это может быть что-то вроде

 def fallback_value(entry_val):
    if entry_val == '':
        return 0  # Replace with your default value
    else:
        return int(entry_val)

mp1 = fallback_value(p1.get())
mp2 = fallback_value(p2.get())
me = fallback_value(e.get())
mc = fallback_value(c.get())
 

Вариант 3

Сделайте так, чтобы ваши get() вызовы запускались только после того, как пользователь заполнил созданные вами записи и нажал кнопку или что-то подобное. Это можно сделать разными способами, используйте свое воображение.

Комментарии:

1. я исправил это, добавив mp1 = float(p1.get()) mp2 = float(p2.get()) me = float(e.get()) mc = float(c.get()) под каждой функцией кнопки спасибо за помощь