|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 sahinzheng 于 2018-1-4 23:16 编辑
网上跟着别人学做的一个简易计算器,但是编完后代码老是运行错误,求各位大神指导
- import re
- import tkinter
- import tkinter.messagebox
- root = tkinter.Tk()
- #设置窗口大小和位置
- root.geometry('300x270+400+100')
- #不允许改变窗口大小
- root.resizable(False,False)
- #设置窗口标题
- root.title('计算器')
- #放置用来显示信息的文本框,并设置为只读
- contentVar = tkinter.StringVar(root,'')
- contentEntry = tkinter.Entry(root,textvariable = contentVar)
- contentEntry['state'] = 'readonly'
- contentEntry.place(x = 10,y = 10,width = 280,height = 20)
- #编写计算器上各种按钮的通用处理代码
- #按钮通用代码
- def buttonClick(btn):
- content = contentVar.get()
- #如果已有内容是以小数点开头的,前面加0
- if content.starswith('.'):
- content = '0' + content
- #根据不同按钮做出相应的处理
- if btn in '0123456789':
- content += btn
- elif btn == '.':
- lastPart = re.split(r'\+|-|\*|/]',content)[-1]
- if '.' in lastPart:
- tkinter.messagebox.showerror('错误','小数点太多了')
- return
- else:
- content += btn
- elif btn == 'C':
- content = ''
- elif btn == '=':
- try:
- #对输入的表达式求值
- content = str(eval(content))
- except:
- tkinter.messagebox.showerror('错误','表达式错误')
- return
- elif btn in operators:
- if content.endswith(operators):
- tkinter.messagebox.showerror('错误','不允许存在连续运算符')
- return
- content += btn
- elif btn == 'Sqrt':
- n = content.split('.')
- if all(map(lambda x: x.isdigit(),n)):
- content = eval(content) **0.5
- else:
- tkinter.messagebox.showerror('错误','表达式错误')
- return
- contentVar.set(content)
- #创建计算器上的各种按钮,设置相应的属性和行为,启动消息主循环
- #放置清楚按钮和等号按钮
- btnClear = tkinter.Button(root,text = "Clear",command = lambda:buttonClick("C"))
- btnClear.place(x=40,y=40,width =80,height =20)
- btnCompute = tkinter.Button(root,text = "=",command = lambda:buttonClick("="))
- btnCompute.place(x=170,y=40,width =80,height =20)
- #放置10个数字、小数点和计算平方根的按钮
- digits = list("0123456789") + ["Sqrt"]
- index = 0
- for row in range(4):
- for col in range(3):
- d = digits[index]
- index += 1
- btnDigit = tkinter.Button(root,text = d,command = lambda x = d:buttonClick(x))
- btnDigit.place(x=20+col*70,y=80+row*50,width=50,height=20 )
- #放置运算符按钮
- operators = ("+","-","*","/","**","//")
- for index, operator in enumerate(operators):
- btnOperator = tkinter.Button(root,text = operator,command = lambda x = operator:buttonClick(x))
- btnOperator.place(x=230,y=80+index*30,width=50,height=20)
-
- root.mainloop()
复制代码
运行后提示错误为:
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\计算器\计算器.py", line 76, in <module>
d = digits[index]
IndexError: list index out of range
随便点一个按钮后又提示错误:
>>> Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "C:\Users\Administrator\Desktop\计算器\计算器.py", line 66, in <lambda>
btnClear = tkinter.Button(root,text = "Clear",command = lambda:buttonClick("C"))
File "C:\Users\Administrator\Desktop\计算器\计算器.py", line 26, in buttonClick
if content.starswith('.'):
AttributeError: 'str' object has no attribute 'starswith'
错误1:digits只有11个元素,你的2重循环使其index为12了
错误2:startswith(prefix[, start[, end]])
|
|