鱼C论坛

 找回密码
 立即注册
查看: 2018|回复: 2

[已解决]关于简易计算器的问题

[复制链接]
发表于 2018-1-4 23:13:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sahinzheng 于 2018-1-4 23:16 编辑

网上跟着别人学做的一个简易计算器,但是编完后代码老是运行错误,求各位大神指导
  1. import re
  2. import tkinter
  3. import tkinter.messagebox

  4. root = tkinter.Tk()
  5. #设置窗口大小和位置
  6. root.geometry('300x270+400+100')
  7. #不允许改变窗口大小
  8. root.resizable(False,False)
  9. #设置窗口标题
  10. root.title('计算器')

  11. #放置用来显示信息的文本框,并设置为只读
  12. contentVar = tkinter.StringVar(root,'')
  13. contentEntry = tkinter.Entry(root,textvariable = contentVar)
  14. contentEntry['state'] = 'readonly'
  15. contentEntry.place(x = 10,y = 10,width = 280,height = 20)



  16. #编写计算器上各种按钮的通用处理代码
  17. #按钮通用代码
  18. def buttonClick(btn):
  19.     content = contentVar.get()
  20.     #如果已有内容是以小数点开头的,前面加0
  21.     if content.starswith('.'):
  22.         content = '0' + content

  23.     #根据不同按钮做出相应的处理
  24.     if btn in '0123456789':
  25.         content += btn
  26.     elif btn == '.':
  27.         lastPart = re.split(r'\+|-|\*|/]',content)[-1]
  28.         if  '.' in lastPart:
  29.             tkinter.messagebox.showerror('错误','小数点太多了')
  30.             return
  31.         else:
  32.             content += btn
  33.     elif btn == 'C':
  34.         content = ''
  35.     elif btn == '=':
  36.         try:
  37.             #对输入的表达式求值
  38.             content = str(eval(content))
  39.         except:
  40.             tkinter.messagebox.showerror('错误','表达式错误')
  41.             return
  42.     elif btn in operators:
  43.         if content.endswith(operators):
  44.             tkinter.messagebox.showerror('错误','不允许存在连续运算符')
  45.             return
  46.         content += btn
  47.     elif btn == 'Sqrt':
  48.         n = content.split('.')
  49.         if all(map(lambda x: x.isdigit(),n)):
  50.             content = eval(content) **0.5
  51.         else:
  52.             tkinter.messagebox.showerror('错误','表达式错误')
  53.             return
  54.     contentVar.set(content)



  55. #创建计算器上的各种按钮,设置相应的属性和行为,启动消息主循环
  56. #放置清楚按钮和等号按钮
  57. btnClear = tkinter.Button(root,text = "Clear",command = lambda:buttonClick("C"))
  58. btnClear.place(x=40,y=40,width =80,height =20)
  59. btnCompute = tkinter.Button(root,text = "=",command = lambda:buttonClick("="))
  60. btnCompute.place(x=170,y=40,width =80,height =20)

  61. #放置10个数字、小数点和计算平方根的按钮
  62. digits = list("0123456789") + ["Sqrt"]
  63. index = 0
  64. for row in range(4):
  65.     for col in range(3):
  66.         d = digits[index]
  67.         index += 1
  68.         btnDigit = tkinter.Button(root,text = d,command = lambda x = d:buttonClick(x))
  69.         btnDigit.place(x=20+col*70,y=80+row*50,width=50,height=20 )
  70. #放置运算符按钮
  71. operators = ("+","-","*","/","**","//")
  72. for index, operator in enumerate(operators):
  73.     btnOperator = tkinter.Button(root,text = operator,command = lambda x = operator:buttonClick(x))
  74.     btnOperator.place(x=230,y=80+index*30,width=50,height=20)
  75.    
  76. 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
1.png
随便点一个按钮后又提示错误:

>>> 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'

最佳答案
2018-1-5 08:27:47
错误1:digits只有11个元素,你的2重循环使其index为12了
错误2:startswith(prefix[, start[, end]])
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-5 00:09:30 | 显示全部楼层
本帖最后由 风吹雨起#泪花落 于 2018-1-5 00:10 编辑

26行 --- if len(content) > 0 and content[0] == '.':

72行 --- digits = list("0123456789") + ["Sqrt"] + ["随便加一个"]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-5 08:27:47 | 显示全部楼层    本楼为最佳答案   
错误1:digits只有11个元素,你的2重循环使其index为12了
错误2:startswith(prefix[, start[, end]])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-5 11:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表