#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]
intolst = [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()) под каждой функцией кнопки спасибо за помощь