利用python的Tkinter库开发一个简易计算器
前言
任何主流语言都可以开发一个简易的计算器,本篇我们将选用python来开发!附源代码
提示:以下是本篇文章正文内容,下面案例可供参考
一、实验准备
1.开发软件选用——jupyter notebook
能编写python的软件有很多,本次实验我使用,当你要使用jupyter notebook首先要安装anaconda,安装的教程如下Anaconda 的安装教程(图文)但要注意的是Anaconda国内安装的清华源不可用,需要用到清华镜像,可在百度自查,这里就不附链接了。
2.图形界面的实现——Tkinter
当我们用python实现图形界面是,我们不得不用到的包就是Tkinter。Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的。所有开发一个图像化的小窗口,就是必要的。因为其语言简单易读,容易上手,这也是我选择python来做一个计算器的原因。若想详细了解Tkinter,可以看下大佬的详解,附链接:Python GUI之tkinter窗口视窗教程大集合
二、开发步骤步骤
1.引入库
这时候我们要调用python的Tkinter和math两个包,需要注意的是在python3以后Tkinter的调用‘T’是大写!!!不然编译会报错。
代码如下:
import math
import tkinter as tk
2.界面设计
程序设计主要分两大部分,一部分是界面设计,另一部分则是实现计算。首先我们来看下界面设计。首先我们先搭建一个框架,可以利用循环来补入按键,在这之前我们要注意给计算器初始化
代码如下(示例):
class Calc(tk.Tk):
"""计算器窗体类"""
def __init__(self):
"""初始化实例"""
tk.Tk.__init__(self)
self.title("我的计算器")
self.memory = 0 # 暂存数值
self.Demo()
def Demo(self):
"""创建界面"""
btn_list = ["C", "(", ")", "/",
"7", "8", "9", "*",
"4", "5", "6", "-",
"1", "2", "3", "+",
"+/-", "0", ".", "="]
r = 1
c = 0
for b in btn_list:
self.button = tk.Button(self, text=b, width=5,
command=(lambda x=b: self.operate(x)))
self.button.grid(row=r, column=c, padx=3, pady=6)
c += 1
if c > 3:
c = 0
r += 1
self.entry = tk.Entry(self, width=24, borderwidth=2,
bg="black", font=("黑体", 11))
self.entry.grid(row=0, column=0, columnspan=4, padx=8, pady=6)
接下来就是实现算法部分了,在以往c++中为了实现一个多项式如:2-(3-2),当一下子多项式输入在计算器中,这一类关于括号优先级问题就得被考虑,还需要将数字和符号分别压入堆栈,判断优先级,当我们使用python时,则可以通过Tkinter文本框(entry)来实现entry的用法有很多,可看Python XML解析来了解更多,这里就不一一赘述了
代码如下:
def operate(self, key):
"""press the button"""
if key == "=": # 输出结果
result = eval(self.entry.get())#获取文本框输入的值(值为=)
self.entry.insert(tk.END, " = " + str(result))#在’=‘后输出计算结果
elif key == "C": # 清空输入框
self.entry.delete(0, tk.END)#将结果清零
elif key == "+/-": # 取相反数
if "=" in self.entry.get():
self.entry.delete(0, tk.END)
elif self.entry.get()[0] == "-":
self.entry.delete(0)
else:
self.entry.insert(0, "-")
else: # 其他键
if "=" in self.entry.get():
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, key)
if __name__ == "__main__":
Calculator().mainloop()
3.关键——实现Tkinter库的调用
python提供了多个图形开发界面的库,常用的库就用Tkinter,使用Tkinter可以大大减少代码的行数,思路也较为清晰简单,简单易读,但在编写过程中,主要通过运用Tkinter的函数,这也使得程序的算法没有那么的突出。
总结
本文仅仅简单介绍了Tkinter的使用,来开发一个简易的计算器。大家可以根据可以通过下面的源代码,运行下来试一下,另附演示动图。另外对于本文中提到的Tkinter库有感兴趣的可以看下上面的链接,很详细源代码
import tkinter as tk
class Calculator(tk.Tk):
"""计算器窗体类"""
def __init__(self):
"""初始化实例"""
tk.Tk.__init__(self)
self.title("我的计算器")
self.memory = 0 # 暂存数值
self.Demo()
def Demo(self):
"""Create the Demo"""
btn_list = ["C", "(", ")", "/",
"7", "8", "9", "*",
"4", "5", "6", "-",
"1", "2", "3", "+",
"+/-", "0", ".", "="]
r = 1
c = 0
for b in btn_list:
self.button = tk.Button(self, text=b, width=5,
command=(lambda x=b: self.operate(x)))
self.button.grid(row=r, column=c, padx=3, pady=6)
c += 1
if c > 3:
c = 0
r += 1
self.entry = tk.Entry(self, width=21, borderwidth=3,
bg="light blue", font=("黑体", 11))
self.entry.grid(row=0, column=0, columnspan=4, padx=8, pady=6)
def operate(self, key):
"""press the button"""
if key == "=": # 输出结果
result = eval(self.entry.get())#获取文本框输入的值(值为=)
self.entry.insert(tk.END, " = " + str(result))#在’=‘后输出计算结果
elif key == "C": # 清空输入框
self.entry.delete(0, tk.END)#将结果清零
elif key == "+/-": # 取相反数
if "=" in self.entry.get():
self.entry.delete(0, tk.END)
elif self.entry.get()[0] == "-":
self.entry.delete(0)
else:
self.entry.insert(0, "-")
else: # 其他键
if "=" in self.entry.get():
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, key)
if __name__ == "__main__":
Calculator().mainloop()