[英]python GUI TypeError: 'str' object is not callable
好的,所以我應該使用python中的GUI制作一個基本的計算器。 我完成了所有按鈕的工作。 現在,對於第2步,我應該繼承原始的計算器類並創建一個名為BetterCalculator的新類,該類添加了sqrt,log,pct和pow按鈕。 除電源按鈕外,我一切正常,當我用老師所說的驅動程序運行程序時,出現此錯誤:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
return self.func(*args)
File "E:\calculator\Calculator in class\calculator.py", line 102, in do3
self.n.set(self.n.get()+'3')
TypeError: 'str' object is not callable
這是我的代碼:
#Windows basic built-in interface library.
import tkinter
import math
class Calculator:
def __init__(self):
self.win = tkinter.Tk() # Window object created
# Create frames for buttons. Win frame, topFrame(label, display) \
# bottomFrame (numberFrame
self.topFrame = tkinter.Frame(self.win)
self.bottomFrame = tkinter.Frame(self.win)
self.numbersFrame = tkinter.Frame(self.bottomFrame)
self.no123Frame = tkinter.Frame(self.numbersFrame)
self.no456Frame = tkinter.Frame(self.numbersFrame)
self.no789Frame = tkinter.Frame(self.numbersFrame)
self.no0DFrame = tkinter.Frame(self.numbersFrame)
self.optsFrame = tkinter.Frame(self.bottomFrame)
# Create object Label to use for input and output. StringVar is a class.
self.n = tkinter.StringVar()
# Display object created
self.display = tkinter.Label(self.topFrame, textvariable = self.n, bg = 'white', font = 12, height = 2, width = 20)
# Number Buttons created. self.b1 = object, tkinter.button calls button module, command = do1 will\
# become a method.
self.b1 = tkinter.Button(self.no123Frame, width = 3 , text = '1', command = self.do1)
self.b2 = tkinter.Button(self.no123Frame, width = 3 , text = '2', command = self.do2)
self.b3 = tkinter.Button(self.no123Frame, width = 3 , text = '3', command = self.do3)
self.b4 = tkinter.Button(self.no456Frame, width = 3 , text = '4', command = self.do4)
self.b5 = tkinter.Button(self.no456Frame, width = 3 , text = '5', command = self.do5)
self.b6 = tkinter.Button(self.no456Frame, width = 3 , text = '6', command = self.do6)
self.b7 = tkinter.Button(self.no789Frame, width = 3 , text = '7', command = self.do7)
self.b8 = tkinter.Button(self.no789Frame, width = 3 , text = '8', command = self.do8)
self.b9 = tkinter.Button(self.no789Frame, width = 3 , text = '9', command = self.do9)
self.b0 = tkinter.Button(self.no0DFrame, width = 3 , text = '0', command = self.do0)
self.bD = tkinter.Button(self.no0DFrame, width = 3 , text = '.', command = self.doD)
self.bCal = tkinter.Button(self.no0DFrame, width = 3 , text = '=', command = self.cal)
# Operators created
self.bAdd = tkinter.Button(self.optsFrame, width = 5, text = '+', command = self.add)
self.bSub = tkinter.Button(self.optsFrame, width = 5, text = '-', command = self.sub)
self.bMul = tkinter.Button(self.optsFrame, width = 5, text = '*', command = self.mul)
self.bDiv = tkinter.Button(self.optsFrame, width = 5, text = '/', command = self.div)
self.bMod = tkinter.Button(self.optsFrame, width = 5, text = '%', command = self.mod)
self.bClr = tkinter.Button(self.topFrame, width = 5, text = 'Clear', command = self.clr)
# Create numbers. op1 = operand, op2 = operator
op1 = 0.0
op2 = 0.0
opt = ''
def organizeInterface(self):
# Method pack object(assembling display label into window).
# Order of packing will be the order the labels will display.
self.display.pack(side = 'left')
self.bClr.pack()
self.topFrame.pack()
self.b1.pack(side = 'left')
self.b2.pack(side = 'left')
self.b3.pack(side = 'left')
self.no123Frame.pack()
self.b4.pack(side = 'left')
self.b5.pack(side = 'left')
self.b6.pack(side = 'left')
self.no456Frame.pack()
self.b7.pack(side = 'left')
self.b8.pack(side = 'left')
self.b9.pack(side = 'left')
self.no789Frame.pack()
self.bD.pack(side = 'left')
self.b0.pack(side = 'left')
self.bCal.pack(side = 'left')
self.no0DFrame.pack(side = 'left')
self.numbersFrame.pack(side = 'left')
self.bAdd.pack(side = 'left')
self.bSub.pack(side = 'left')
self.bDiv.pack(side = 'left')
self.bMul.pack(side = 'left')
self.bMod.pack(side = 'left')
self.optsFrame.pack()
self.bottomFrame.pack()
def runInterface(self):
tkinter.mainloop()
#clear user input.
def clear(self):
self.op1 = 0.0
self.op2 = 0.0
self.opt = ''
# Set user input, set variable self.n.set then self.n.get will append and concatonate.
def do1(self):
self.n.set(self.n.get()+'1')
def do2(self):
self.n.set(self.n.get()+'2')
def do3(self):
self.n.set(self.n.get()+'3')
def do4(self):
self.n.set(self.n.get()+'4')
def do5(self):
self.n.set(self.n.get()+'5')
def do6(self):
self.n.set(self.n.get()+'6')
def do7(self):
self.n.set(self.n.get()+'7')
def do8(self):
self.n.set(self.n.get()+'8')
def do9(self):
self.n.set(self.n.get()+'9')
def do0(self):
self.n.set(self.n.get()+'0')
def doD(self):
self.n.set(self.n.get()+'.')
# record operator = self.opt and get first number entry = self.n.get().
# need to clean up the label of the first number entry before getting next \
# entry of numbers.
def add(self):
self.opt = '+'
self.op1 = float(self.n.get())
self.n.set('')
#to get calculator to see negative number verse \
#subtraction create if statement for empty string.
def sub(self):
if self.n.get() == '':
self.n.set('-')
else:
self.opt = '-'
self.op1 = float(self.n.get())
self.n.set('')
def mul(self):
self.opt = '*'
self.op1 = float(self.n.get())
self.n.set('')
def div(self):
self.opt = '/'
self.op1 = float(self.n.get())
self.n.set('')
def mod(self):
self.opt = '%'
self.op1 = float(self.n.get())
self.n.set('')
# clear set to clr button to clean label
def clr(self):
self.clear()
self.n.set('')
# Call calculate method to get calculations and write if statements \
# to define what operator user wanted.
def cal(self):
self.op2 = float(self.n.get())
if self.opt == '+':
self.n.set(self.op1 + self.op2)
elif self.opt == '-':
self.n.set(self.op1 - self.op2)
elif self.opt == '*':
self.n.set(self.op1 * self.op2)
elif self.opt == '/':
self.n.set(self.op1 / self.op2)
elif self.opt == '%':
self.n.set(self.op1 % self.op2)
class BetterCalculator(Calculator):
def __init__(self):
Calculator.__init__(self)
self.uOptsFrame = tkinter.Frame(self.bottomFrame)
self.bLog = tkinter.Button(self.uOptsFrame, width = 5, text = 'log', command = self.log)
self.bPct = tkinter.Button(self.uOptsFrame, width = 5, text = 'Pct', command = self.pct)
self.bSqrt = tkinter.Button(self.uOptsFrame, width = 5, text = 'Sqrt', command = self.sqrt)
self.bPow = tkinter.Button(self.optsFrame, width = 5, text = 'pow', command = self.pow)
def reorganizeInterface(self):
self.bClr.configure(bg = 'red')
self.bAdd.configure(bg = 'yellow')
self.bSub.configure(bg = 'yellow')
self.bMul.configure(bg = 'yellow')
self.bDiv.configure(bg = 'yellow')
self.bMod.configure(bg = 'yellow')
self.bCal.configure(bg = 'green')
Calculator.organizeInterface(self)
self.bLog.pack()
self.bPct.pack()
self.bSqrt.pack()
self.bPow.pack()
self.uOptsFrame.pack(side='left')
def log(self):
self.op1 = float(self.n.get())
self.n.set(math.log(self.op1))
def pct(self):
self.op1 = float(self.n.get())
self.n.set(self.op1 * 100)
def sqrt(self):
self.op1 = float(self.n.get())
self.n.set(math.sqrt(self.op1))
def pow(self):
self.opt = 'pow'
self.op1 = float(self.n.get())
self.n.set = ('')
def cal(self):
Calculator.cal(self)
if self.opt == 'pow':
self.n.set(self.op1 ** self.op2)
這是該程序的驅動程序使運行的單獨文件:
import calculator
import math
def main():
myCal = calculator.BetterCalculator()
myCal.reorganizeInterface()
myCal.runInterface()
main()
在不看其余代碼的情況下,我看到一個明顯的錯字/ pow
-o:
def pow(self):
self.opt = 'pow'
self.op1 = float(self.n.get())
self.n.set = ('')
最后一行應該是:
self.n.set('')
不包含=
部分,以便調用self.n.set
,而不用字符串替換該函數。 (用字符串替換該函數將導致稍后嘗試調用self.n.set
來產生您看到的錯誤。)
看看你的pow()
方法
self.n.set = ('')
絕對是錯字。 用。。。來代替
self.n.set('')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.