01实现
我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括:显示器、键盘、运算的逻辑处理等,计算器的图形界面我们使用 tkinter 库实现,下面看一下具体实现过程。
首先,我们画一个主窗口,代码实现如下:

  1. # 创建主窗口
  2. tk = tkinter.Tk()
  3. # 设置窗口大小和位置
  4. tk.geometry('300x210+500+200')
  5. # 不允许改变窗口大小
  6. tk.resizable(False, False)
  7. # 设置窗口标题
  8. tk.title('计算器')

看一下效果:
image.png

我们接着画显示器,代码实现如下:

  1. # 自动刷新字符串变量,可用 set 和 get 方法进行传值和取值
  2. contentVar = tkinter.StringVar(tk, '')
  3. # 创建单行文本框
  4. contentEntry = tkinter.Entry(tk, textvariable=contentVar)
  5. # 设置文本框为只读
  6. contentEntry['state'] = 'readonly'
  7. # 设置文本框坐标及宽高
  8. contentEntry.place(x=20, y=10, width=260, height=30)

再接着画键盘,代码实现如下:

  1. # 按钮显示内容
  2. bvalue = ['C', '+', '-', '//', '2', '0', '1', '√', '3', '4', '5', '*', '6', '7', '8', '.', '9', '/', '**', '=']
  3. index = 0
  4. # 将按钮进行 5x4 放置
  5. for row in range(5):
  6. for col in range(4):
  7. d = bvalue[index]
  8. index += 1
  9. btnDigit = tkinter.Button(tk, text=d, command=lambda x=d: onclick(x))
  10. btnDigit.place(x=20 + col * 70, y=50 + row * 30, width=50, height=20)

看一下效果:
image.png
界面画完了,我们看一下处理运算逻辑的代码,如下所示:

  1. # 点击事件
  2. def onclick(btn):
  3. # 运算符
  4. operation = ('+', '-', '*', '/', '**', '//')
  5. # 获取文本框中的内容
  6. content = contentVar.get()
  7. # 如果已有内容是以小数点开头的,在前面加 0
  8. if content.startswith('.'):
  9. content = '0' + content # 字符串可以直接用+来增加字符
  10. # 根据不同的按钮作出不同的反应
  11. if btn in '0123456789':
  12. # 按下 0-9 在 content 中追加
  13. content += btn
  14. elif btn == '.':
  15. # 将 content 从 +-*/ 这些字符的地方分割开来
  16. lastPart = re.split(r'\+|-|\*|/', content)[-1]
  17. if '.' in lastPart:
  18. # 信息提示对话框
  19. tkinter.messagebox.showerror('错误', '重复出现的小数点')
  20. return
  21. else:
  22. content += btn
  23. elif btn == 'C':
  24. # 清除文本框
  25. content = ''
  26. elif btn == '=':
  27. try:
  28. # 对输入的表达式求值
  29. content = str(eval(content))
  30. except:
  31. tkinter.messagebox.showerror('错误', '表达式有误')
  32. return
  33. elif btn in operation:
  34. if content.endswith(operation):
  35. tkinter.messagebox.showerror('错误', '不允许存在连续运算符')
  36. return
  37. content += btn
  38. elif btn == '√':
  39. # 从 . 处分割存入 n,n 是一个列表
  40. n = content.split('.')
  41. # 如果列表中所有的都是数字,就是为了检查表达式是不是正确的
  42. if all(map(lambda x: x.isdigit(), n)):
  43. content = eval(content) ** 0.5
  44. else:
  45. tkinter.messagebox.showerror('错误', '表达式错误')
  46. return
  47. # 将结果显示到文本框中
  48. contentVar.set(content)

整体实现完了之后,我们来演示一下,看一下效果:
image.png
是不是有内味了。

02 打包

为了更加方便的使用,我们可以将 Python 代码打包成 exe 文件,打包我们使用 pyinstaller,安装用 pip install pyinstaller 命令即可。
打包时我们使用 pyinstaller —onefile —nowindowed counter.py 命令即可,此时打包生成的文件是使用的默认图标,如果我们想指定自己的图标可以添加参数 —icon=”xxx\xxx.ico”,打包生成的文件在 dist 目录。
如下图所示:
image.png
此时,我们直接运行 exe 文件就行了。

03 总结

本文我们使用 Python 实现了一个简易的计算器,大家如果有兴趣的话,可以尝试添加更多的功能以及对键盘进行个性化修改。

完整代码

  1. import tkinter
  2. import re
  3. from tkinter import messagebox
  4. # 创建主窗口
  5. tk = tkinter.Tk()
  6. # 设置窗口大小和位置
  7. tk.geometry('300x210+500+200')
  8. # 不允许改变窗口大小
  9. tk.resizable(False, False)
  10. # 设置窗口标题
  11. tk.title('计算器')
  12. # 自动刷新字符串变量,可用 set 和 get 方法进行传值和取值
  13. contentVar = tkinter.StringVar(tk, '')
  14. # 创建单行文本框
  15. contentEntry = tkinter.Entry(tk, textvariable=contentVar)
  16. # 设置文本框为只读
  17. contentEntry['state'] = 'readonly'
  18. # 设置文本框坐标及宽高
  19. contentEntry.place(x=20, y=10, width=260, height=30)
  20. # 按钮显示内容
  21. bvalue = ['C', '+', '-', '//', '2', '0', '1', '√', '3', '4', '5', '*', '6', '7', '8', '.', '9', '/', '**', '=']
  22. index = 0
  23. # 将按钮进行 5x4 放置
  24. for row in range(5):
  25. for col in range(4):
  26. d = bvalue[index]
  27. index += 1
  28. btnDigit = tkinter.Button(tk, text=d, command=lambda x=d: onclick(x))
  29. btnDigit.place(x=20 + col * 70, y=50 + row * 30, width=50, height=20)
  30. '''
  31. contentVar.set() # 设置文本显示内容
  32. print(contentVar.get()) # 获取文本框内容
  33. '''
  34. # 点击事件
  35. def onclick(btn):
  36. # 运算符
  37. operation = ('+', '-', '*', '/', '**', '//')
  38. # 获取文本框中的内容
  39. content = contentVar.get()
  40. # 如果已有内容是以小数点开头的,在前面加 0
  41. if content.startswith('.'):
  42. content = '0' + content # 字符串可以直接用+来增加字符
  43. # 根据不同的按钮作出不同的反应
  44. if btn in '0123456789':
  45. # 按下 0-9 在 content 中追加
  46. content += btn
  47. elif btn == '.':
  48. # 将 content 从 +-*/ 这些字符的地方分割开来
  49. lastPart = re.split(r'\+|-|\*|/', content)[-1]
  50. if '.' in lastPart:
  51. # 信息提示对话框
  52. tkinter.messagebox.showerror('错误', '重复出现的小数点')
  53. return
  54. else:
  55. content += btn
  56. elif btn == 'C':
  57. # 清除文本框
  58. content = ''
  59. elif btn == '=':
  60. try:
  61. # 对输入的表达式求值
  62. content = str(eval(content))
  63. except:
  64. tkinter.messagebox.showerror('错误', '表达式有误')
  65. return
  66. elif btn in operation:
  67. if content.endswith(operation):
  68. tkinter.messagebox.showerror('错误', '不允许存在连续运算符')
  69. return
  70. content += btn
  71. elif btn == '√':
  72. # 从 . 处分割存入 n,n 是一个列表
  73. n = content.split('.')
  74. # 如果列表中所有的都是数字,就是为了检查表达式是不是正确的
  75. if all(map(lambda x: x.isdigit(), n)):
  76. content = eval(content) ** 0.5
  77. else:
  78. tkinter.messagebox.showerror('错误', '表达式错误')
  79. return
  80. # 将结果显示到文本框中
  81. contentVar.set(content)
  82. tk.mainloop() # 循环