简体   繁体   中英

unsupported operand type(s) for ** or pow(): 'method' and 'int'

from tkinter import *
import math
import sys

def quit():
  root.destroy()

def a_b_c():
  print_a()
  print_b()
  print_c()
  calculation()
  return

def print_a():
  get_a = a.get()
  printing_a = Label(root, text=get_a).grid(row=8, column=1)
  return

def print_b():
  get_b = b.get()
  printing_b =Label(root, text=get_b).grid(row=12, column=1)
  return

def print_c():
  get_c = c.get()
  printing_c =Label(root, text=get_c).grid(row=16, column=1)
  return


root = Tk()
a = StringVar()
b = StringVar()
c = StringVar()

root.title('Solving Quadratic Equations')

quit_b = Button(root, text="quit",command=quit).grid(row=1, column=1)
go_b = Button(root, text="go", command=a_b_c).grid(row=1, column=2)
welcome = Label(root, text="Welcome to Solving Quadratic Equations with GlaDOS",font=("Helvetica",13))
welcome.grid(row=2, column=1)


instructions = Label(root, text="So how do i use this program? is what you may ask yourself. So, for example, \n you have the equation 2x^2+5x+8=0. So the 2x^2 is a but you don't put the\n whole thing in you just but the 2 from the start in. The next thing is b\n in this case b = 5 and c is equal to 8. Once you have all you number in the boxes \n hit the go button. Remember you don't need the x's. ", font=("Helvetica",11))
instructions.grid(row=3, column=1)

line = Label(root, text="************************************************************************************************************").grid(row=4, column=1)

input_a = Label(root, text="Pls input A here", font=("Helvetica",11)).grid(row=6, column=1)
entry_a = Entry(root,textvariable=a).grid(row=7,column=1)

line = Label(root, text="************************************************************************************************************").grid(row=9, column=1)

input_b = Label(root, text="Pls input B here", font=("Helvetica",11)).grid(row=10, column=1)
entry_b = Entry(root,textvariable=b).grid(row=11,column=1)

line = Label(root, text="*************************************************************************************************************").grid(row=13, column=1)
input_c = Label(root, text="Pls input C here", font=("Helvetica",11)).grid(row=14, column=1)
entry_c = Entry(root,textvariable=c).grid(row=15,column=1)

two_a = a.get
two_b = b.get
two_c = c.get

d = two_b**2-4*two_a*two_c
def calculation():
  if d < 0:
  no_solution = Label(root, text="This equation has no real solution").grid(row=19, column=1)
  elif d == 0:
  x = (-two_b+math.sqrt(two_b**2-4*two_a*two_c))/2*two_a
  one_solution = Label(root, text="This equation has one solutions: {}".format(x)).grid(row=20, column=1)
  else:
  x1 = (-two_b+math.sqrt((two_b**2)-(4*(two_a*two_c))))/(2*two_a)
  x1 = (-two_b-math.sqrt((two_b**2)-(4*(two_a*two_c))))/(2*two_a)
  two_solution= label(root, text="This equation has two solutions: {} or {} ".format(x1,x2)).grid(row=21, colum=1)

root.mainloop()

why does it say unsupported operand type(s) for ** or pow(): method or int? can someone help me to change it so it works it is for school and the teacher can't help me. I am trying to make a program that helps you to solve quadratic equations and the part at the bottom dosent work( def calculation) thanks for helping me :)

You are assigning a few values:

two_a = a.get
two_b = b.get
two_c = c.get

And then doing calculations:

d = two_b**2-...

However, a.get is a method that retrieves the value of that StringVar . To actually call it and retrieve the value, you have to... well, call it, with parentheses:

two_a = a.get()

Furthermore, you will then have strings. Cast them to integers or floating-point numbers with int or float :

two_a = int(a.get())
# or:
two_a = float(a.get())

Then your arithmetic will work as expected.

Please read and study this SO help page about mcves . Here is an mcve based on the code you posted. It produces the exact same error message on the last line.

import tkinter as tk
root = tk.Tk()
b = tk.StringVar(root)
two_b = b.get
d = two_b**2

Raising a method to a power is nonsensical. You need to call () the method and convert the string to a number. Do the latter either by using DoubleVar or IntVar instead of StringVar or by passing the result of get to float() or int() before doing arithmetic on it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM