Калькулятор квадратичного уравнения с использованием Tkinter.Проблемы с определением переменных - PullRequest
0 голосов
/ 06 октября 2018

В настоящее время я работаю над созданием квадратичного калькулятора с графическим интерфейсом.У меня есть обе части независимо, и теперь, пытаясь объединить их, я сталкиваюсь с проблемой.Вот мой код.

from tkinter import *
from tkinter import ttk
import math

def click():
    entered_text=textentry.get()

def search():
    print(a.get())
    print(b.get())
    print(c.get())
    return ''

#Window and Title
root = Tk()
root.title("Quadratic Calculator")
root.configure(background="black")
Label (root, text="Quadratic Calculator", bg="black", fg="grey", font="none 18 bold") .grid(row=1, column=0, sticky=N)

a=StringVar()
b=StringVar()
c=StringVar()

#inputs
Label (root, text="Enter your A value!", bg="black", fg="grey", font="none 12 bold") .grid(row=2, column=0, sticky=N)
textentry = Entry(root, width=20, bg="white", textvariable=a)
textentry.grid(row=3, column=0, sticky=N)
Label (root, text="Enter your B value!", bg="black", fg="grey", font="none 12 bold") .grid(row=4, column=0, sticky=N)
textentry = Entry(root, width=20, bg="white", textvariable=b)
textentry.grid(row=5, column=0, sticky=N)
Label (root, text="Enter your c value!", bg="black", fg="grey", font="none 12 bold") .grid(row=6, column=0, sticky=N)
textentry = Entry(root, width=20, bg="white", textvariable=c)
textentry.grid(row=7, column=0, sticky=N)

#Answer
Label (root, text="Answer!", bg="black", fg="grey", font="none 12 bold").grid(row=8, column=0, sticky=N)
output = Text(root, width=75, height=6, wrap=WORD, bg="white")
output.grid(row=9, column=0, columnspan=2, sticky=N)
a = float(a)
b = float(b)
c = float(c)
d = (math.pow(b,2)-4*a*c)
if d < 0:
   print("There is no answer")
elif d == 0:
     x =(-b + (d))/ (2*a)
     print("There is one answer:",x)

else:
    x1 = ( -b + (math.sqrt(d)))/ (2*a)
    x2 = ( -b - (math.sqrt(d)))/ (2*a)
    print("There are two answers:", x1,"and" ,x2)

#Solve Button
Button(root, text="Solve", width=6, command=search) .grid(row=10, column=0,
sticky=N)

root.mainloop()

Проблема, с которой я столкнулся, состоит в том, что переменные a, b и c являются float s в одной моей программе, но в этойдля того, чтобы они были собраны как входные данные, они должны быть строками.Как мне сделать так, чтобы в одной части моей программы они могли быть строкой, а в другой - плавающей.Или как сделать так, чтобы они подходили обоим.Не бойтесь критиковать что-то еще, это опыт обучения для меня.Точная ошибка, которую я получаю: TypeError: float() argument must be a string or a number, not 'StringVar'.

1 Ответ

0 голосов
/ 06 октября 2018

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

Поскольку a, b и c должны содержать значения float, это будет немногоудобнее сделать их типа tkinter.DoubleVar, потому что таким образом вам не нужно будет извлекать и преобразовывать строковые значения, каждое из которых содержит, в значения float везде, где они необходимы для этого типа.

Обратите внимание, чтопоскольку ваша программа ожидает, что они будут чем-то действительным, математически, при запуске они также должны будут инициализироваться с некоторыми значениями, что не вызовет ошибку, когда они используются при оценке операторов на основе формулы, которая решаетуравнение:

a = DoubleVar()
a.set(1.0)
b = DoubleVar()
b.set(0.0)
c = DoubleVar()
c.set(0.0)

Чтобы избежать проблемы необходимости использования обоих виджетов tkinter для графического интерфейса пользователя и значений float для вычислений, простейшим решением, вероятно, является просто получение и сохранение значений с плавающей точкой во временных переменных и использованиете, по мере необходимости.В вашем коде все это происходит в разделе #Answer.Обратите внимание, что этот подход позволяет избежать изменения типа объекта (виджета tkinter), которому назначены переменные a, b и c (в отличие от кода в вашем вопросе).

# Get current values of DoubleVars.
a_val = a.get()
b_val = b.get()
c_val = c.get()

d = math.pow(b_val, 2) - 4*a_val*c_val
if d < 0:
    print("There is no answer")
elif d == 0:
    x = (-b_val + d) / (2*a_val)
    print("There is one answer:", x)
else:
    x1 = (-b_val + math.sqrt(d)) / (2*a_val)
    x2 = (-b_val - math.sqrt(d)) / (2*a_val)
    print("There are two answers:", x1, "and", x2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...