python - 使用 Tkinter 的二次方程计算器。定义变量时遇到问题

标签 python user-interface tkinter

我目前正在制作一个带有 GUI 的二次计算器。我有两个部分独立启动和运行,但现在在尝试将它们结合起来时遇到了一个问题。这是我的代码。

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()

我遇到的问题是变量abcfloat在我的一个程序中,但在这个程序中,为了将它们收集为输入,它们必须是字符串。我该如何做到这一点,以便在我的程序的一部分中它们可以是字符串,而在另一部分中它们可以是 float 。或者我怎样才能使两者都适合。不要害怕对其他任何事情提出批评,这对我来说是一次学习经历。我得到的确切错误是 TypeError: float() argument must be a string or a number, not 'StringVar'.

最佳答案

您需要进行两组更改才能让计算器开始工作。

由于abc需要包含float值,所以会稍微方便一些使它们成为 tkinter.DoubleVar 类型,因为这样您就不需要在其他需要它们的地方检索每个包含的字符串值并将其转换为 float 值类型。

请注意,因为您的程序期望它们在数学上是有效的,所以当它启动时,它们还需要使用一些值进行初始化,当它们用于评估基于以下内容的语句时,不会导致错误求解方程的公式:

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

为了避免 GUI 需要 tkinter 小部件和计算需要 float 值的问题,最简单的解决方案可能只是检索浮点值并将其存储在临时变量中,并根据需要使用它们。在您的代码中,这一切都发生在 #Answer 部分。请注意,此方法避免更改变量 abc 分配给的对象(tkinter 小部件)的类型(与您问题中的代码)。

# 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)

关于python - 使用 Tkinter 的二次方程计算器。定义变量时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52680358/

相关文章:

python - tkinter 中的帧不堆叠在一起

Python3 Tkinter 字体不工作

python - scrapy无法抓取页面中的所有链接

python - Discord.py client.say 在事件循环任务中不起作用

java - 从另一种方法访问 gui

android - 使用 appcompat v21 实现带有卡片工具栏的灵活工具栏

python - 如何从 Python 获取失败服务的 systemctl 结果?

python - 演示所有 PEP-8 规则的完整代码示例

user-interface - 如何使用应用程序脚本在 Google 电子表格的单元格内添加 UI?

python - 在全屏模式下显示单个图像(如 powerpoint)