我想在计算器示例中添加求解二次和三次方程的功能,我在如下所示的所有 3 个位置尝试了 operand3,但收到错误消息:argument 必须是字符串或实数,而不是“列表”,它只会显示终端中的输入,而不显示应用程序中的输入,任何人都可以帮助我,非常感谢,祝你有美好的一天
import flet as ft
class CalcButton(ft.ElevatedButton):
def __init__(self, text, button_clicked, expand=1):
super().__init__()
self.text = text
self.expand = expand
self.on_click = button_clicked
self.data = text
class DigitButton(CalcButton):
def __init__(self, text, button_clicked, expand=1):
CalcButton.__init__(self, text, button_clicked, expand)
self.bgcolor = ft.colors.WHITE24
self.color = ft.colors.WHITE
class ActionButton(CalcButton):
def __init__(self, text, button_clicked):
CalcButton.__init__(self, text, button_clicked)
self.bgcolor = ft.colors.ORANGE
self.color = ft.colors.WHITE
class ExtraActionButton(CalcButton):
def __init__(self, text, button_clicked):
CalcButton.__init__(self, text, button_clicked)
self.bgcolor = ft.colors.BLUE_GREY_100
self.color = ft.colors.BLACK
class CalculatorApp(ft.Container):
# application's root control (i.e. "view") containing all other controls
def __init__(self):
super().__init__()
self.reset()
self.result = ft.Text(value="0", color=ft.colors.WHITE, size=20)
self.width = 350
self.bgcolor = ft.colors.BLACK
self.border_radius = ft.border_radius.all(20)
self.padding = 20
self.content = ft.Column(
controls=[
ft.Row(controls=[self.result], alignment="end"),
ft.Row(
controls=[
ExtraActionButton(
text="AC", button_clicked=self.button_clicked
),
ExtraActionButton(
text="+/-", button_clicked=self.button_clicked
),
ExtraActionButton(text="%", button_clicked=self.button_clicked),
ActionButton(text="/", button_clicked=self.button_clicked),
]
),
ft.Row(
controls=[
DigitButton(text="7", button_clicked=self.button_clicked),
DigitButton(text="8", button_clicked=self.button_clicked),
DigitButton(text="9", button_clicked=self.button_clicked),
ActionButton(text="*", button_clicked=self.button_clicked),
]
),
ft.Row(
controls=[
DigitButton(text="4", button_clicked=self.button_clicked),
DigitButton(text="5", button_clicked=self.button_clicked),
DigitButton(text="6", button_clicked=self.button_clicked),
ActionButton(text="-", button_clicked=self.button_clicked),
]
),
ft.Row(
controls=[
DigitButton(text="1", button_clicked=self.button_clicked),
DigitButton(text="2", button_clicked=self.button_clicked),
DigitButton(text="3", button_clicked=self.button_clicked),
ActionButton(text="+", button_clicked=self.button_clicked),
]
),
ft.Row(
controls=[
DigitButton(
text="0", expand=2, button_clicked=self.button_clicked
),
DigitButton(text=".", button_clicked=self.button_clicked),
ActionButton(text="=", button_clicked=self.button_clicked),
]
),
]
)
def button_clicked(self, e):
data = e.control.data
print(f"Button clicked with data = {data}")
if self.result.value == "Error" or data == "AC":
self.result.value = "0"
self.reset()
elif data in ("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "."):
if self.result.value == "0" or self.new_operand == True:
self.result.value = data
self.new_operand = False
else:
self.result.value = self.result.value + data
elif data in ("+", "-", "*", "/"):
self.result.value = self.calculate(
self.operand1, float(self.result.value), self.operator
)
self.operator = data
if self.result.value == "Error":
self.operand1 = "0"
else:
self.operand1 = float(self.result.value)
self.new_operand = True
elif data in ("="):
self.result.value = self.calculate(
self.operand1, float(self.result.value), self.operator
)
self.reset()
elif data in ("%"):
self.result.value = float(self.result.value) / 100
self.reset()
elif data in ("+/-"):
if float(self.result.value) > 0:
self.result.value = "-" + str(self.result.value)
elif float(self.result.value) < 0:
self.result.value = str(
self.format_number(abs(float(self.result.value)))
)
self.update()
def format_number(self, num):
if num % 1 == 0:
return int(num)
else:
return num
def calculate(self, operand1, operand2, operator):
if operator == "+":
return self.format_number(operand1 + operand2)
elif operator == "-":
return self.format_number(operand1 - operand2)
elif operator == "*":
return self.format_number(operand1 * operand2)
elif operator == "/":
if operand2 == 0:
return "Error"
else:
return self.format_number(operand1 / operand2)
def reset(self):
self.operator = "+"
self.operand1 = 0
self.new_operand = True
def main(page: ft.Page):
page.title = "Calc App"
# create application instance
calc = CalculatorApp()
# add application's root control to the page
page.add(calc)
ft.app(target=main)
elif operator == "ax^2+bx+c=0":
return selv.solv()
def solv():
a = float(input("Nhập a: "))
b = float(input("Nhập b: "))
c = float(input("Nhập c: "))
if a != 0:
delta = b**2 - 4*a*c
if delta > 0:
x1 = (-b + delta**0.5) / (2*a)
x2 = (-b - delta**0.5) / (2*a)
return f"x1 = {x1}, x2 = {x2}"
elif delta == 0:
x = -b / (2*a)
return f"x = {x}"
else:
return "Equation with no solution"
else:
return "Not a quadratic equation"
我想它会满足这样的需求:
import flet as ft
# ... (Your existing button classes)
class CalculatorApp(ft.Container):
def __init__(self):
super().__init__()
self.reset()
self.result = ft.Text(value="0", color=ft.colors.WHITE, size=20)
self.input_a = ft.TextField(label="a", width=50)
self.input_b = ft.TextField(label="b", width=50)
self.input_c = ft.TextField(label="c", width=50)
self.width = 350
self.bgcolor = ft.colors.BLACK
self.border_radius = ft.border_radius.all(20)
self.padding = 20
self.content = ft.Column(
controls=[
ft.Row(controls=[self.result], alignment="end"),
# Quadratic solver inputs and button
ft.Row(
controls=[
self.input_a,
self.input_b,
self.input_c,
ActionButton(text="Solve Quadratic", button_clicked=self.button_clicked, data="Solve Quadratic"),
]
),
# Existing calculator buttons...
]
)
def button_clicked(self, e):
data = e.control.data
print(f"Button clicked with data = {data}")
if data == "AC":
self.result.value = "0"
self.reset()
elif data == "Solve Quadratic":
self.result.value = self.solve_quadratic()
self.update()
return
# Existing code for digit and operation buttons...
self.update()
def solve_quadratic(self):
try:
a = float(self.input_a.value)
b = float(self.input_b.value)
c = float(self.input_c.value)
except ValueError:
return "Invalid input"
if a == 0:
return "Not a quadratic equation"
delta = b**2 - 4*a*c
if delta > 0:
x1 = (-b + delta**0.5) / (2*a)
x2 = (-b - delta**0.5) / (2*a)
return f"x1 = {self.format_number(x1)}, x2 = {self.format_number(x2)}"
elif delta == 0:
x = -b / (2*a)
return f"x = {self.format_number(x)}"
else:
return "No real solutions"
def format_number(self, num):
if num % 1 == 0:
return int(num)
else:
return round(num, 4)
def reset(self):
self.operator = "+"
self.operand1 = 0
self.new_operand = True
# Rest of your code...
def main(page: ft.Page):
page.title = "Calc App"
calc = CalculatorApp()
page.add(calc)
ft.app(target=main)