python语言利用TK实现一个简易计算器

这篇博客介绍了如何使用Python的tkinter库构建一个具备基本四则运算、小数点、清除、删除及记忆功能的计算器。代码详细展示了界面布局、按钮绑定、输入检查及计算过程,包括如何处理运算符覆盖、记忆上一轮计算结果等关键逻辑。

目录

计算机功能描述

导包

代码实现

初始化数据

初始化界面

初始化显示标签

放置按钮

放置数字符

放置运算符

按钮每次输入的实现

检查data

clear函数

mainloop

组合代码

  • 计算机功能描述

具有0~9十位数字、符号’.’,以及+-*/四则运算功能,具有记忆存储功能(下一轮计算用到上一轮结果)、清零、删除功能。共18个按键。

当输入多个字符时,用后一字符覆盖前一字符。

  • 导包

import tkinter as tk

本计算器使用tkinter包实现,as tk是给tkinter重新起了个名字

  • 代码实现

初始化数据

temp=0#记忆上一轮计算的结果
data=[]#记录每一次的按钮输入
check_op="+-*/=bc."

data用来存储每一次按钮的输入或删除,最终通过eval来实现计算。

初始化界面

screen=tk.Tk()
screen.title("计算器")
screen.geometry('340x400')

初始化显示标签

textvar=tk.StringVar()
textvar.set('0')
my_label=tk.Label(screen,textvariable=textvar,width=35,height=4,anchor='e')
my_label.grid(row=0,column=0,columnspan=4)

textvar为标签的可变文本,每一次data的改变都要执行一次textvar.set()

放置按钮

def place_button(master, text, row, col, colspan=1, padx=2, pady=2, width=9, height=2):
    my_button=tk.Button(master,text=text,width=width,height=height)
    my_button.config(command=lambda :add_to_list(text))
    my_button.grid(row=row,column=col,padx=padx,pady=pady,columnspan=colspan)

text为显示文字,row,col为放置行列位置。colspan为按钮横跨格数,padx,pady文本距离边框的距离。width,height按钮的宽和高。

按钮的出发事件为add_to_list,将按钮的文本,也就是按钮上显示的字符,加入到data列表中,等待计算

放置数字符

place_button(screen,text='7',row=1,col=1)
place_button(screen,text='8',row=1,col=2)
place_button(screen,text='9',row=1,col=3)
place_button(screen,text='4',row=2,col=1)
place_button(screen,text='5',row=2,col=2)
place_button(screen,text='6',row=2,col=3)
place_button(screen,text='1',row=3,col=1)
place_button(screen,text='2',row=3,col=2)
place_button(screen,text='3',row=3,col=3)
place_button(screen,text='0',row=4,col=1,colspan=2,width=20)
place_button(screen,text='.',row=4,col=3)

放置运算符

place_button(screen,text='=',row=5,col=3)
place_button(screen,text='b',row=5,col=4)
place_button(screen,text='c',row=5,col=1,colspan=2,width=20)

place_button(screen,text='/',row=1,col=4)
place_button(screen,text='*',row=2,col=4)
place_button(screen,text='-',row=3,col=4)
place_button(screen,text='+',row=4,col=4)

按钮每次输入的实现

def add_to_list(num):
    data.append(num)
    if data[-1] in check_op:
        check()
    else:
        textvar.set("".join(data))

        将符号加入到data列表中,并且当输入非数字字符时进行检查。

检查data

def check():
    global temp
    global data
    if temp !=0 :#如果在上一次计算结束后,按下任意非数字字符,则上一运算结果加入计算
        if data[-1]=='.':
            textvar.set('0')
            return
        op=data[-1]
        data.clear()
        for i in str(temp):
            data.append(i)
        data.append(op)
        temp=0
    if data[-2] in check_op:#如果倒数第二个字符也是非数字字符,则覆盖
        data[-2]=data[-1]
        data.pop()
    if data[-1] == 'b':#如果字符为删除字符,删除列表最后一位
        data = data[:-2]
        textvar.set("".join(data))#实现显示功能
    if data[-1] =='c':#清零
        clear()
    elif data[-1]=='=':#计算
        try:
            temp =eval("".join(data[:-1]))#存储此次计算结果
            textvar.set("".join(data)+str(temp))
            data.clear()#计算后data清空
        except Exception:
            textvar.set("error")#计算错误则输出error
    else:
        textvar.set("".join(data))

详细见注释。check函数实现了运算符号的使用,符号覆盖以及记忆上一运算结果的功能。

clear函数

  def clear():
    data.clear()
    textvar.set('0')

        data列表清空

mainloop

screen.mainloop()
  • 组合代码

import tkinter as tk

temp=0
data=[]
check_op="+-*/=bc."

#检查输入
def check():
    global temp
    global data
    if temp !=0 :#如果在上一次计算结束后,按下任意非数字字符,则上一运算结果加入计算
        if data[-1]=='.':
            textvar.set('0')
            return
        op=data[-1]
        data.clear()
        for i in str(temp):
            data.append(i)
        data.append(op)
        temp=0
    if data[-2] in check_op:#如果倒数第二个字符也是非数字字符,则覆盖
        data[-2]=data[-1]
        data.pop()
    if data[-1] == 'b':#如果字符为删除字符,删除列表最后一位
        data = data[:-2]
        textvar.set("".join(data))#实现显示功能
    if data[-1] =='c':#清零
        clear()
    elif data[-1]=='=':#计算
        try:
            temp =eval("".join(data[:-1]))#存储此次计算结果
            textvar.set("".join(data)+str(temp))
            data.clear()#计算后data清空
        except Exception:
            textvar.set("error")#计算错误则输出error
    else:
        textvar.set("".join(data))

#清除输入
def clear():
    data.clear()
    textvar.set('0')

#输入
def add_to_list(num):
    data.append(num)
    if data[-1] in check_op:
        check()
    else:
        textvar.set("".join(data))

#放置按钮
def place_button(master,text,row,col,colspan=1,padx=2,pady=2,width=9,height=2):
    my_button=tk.Button(master,text=text,width=width,height=height)
    my_button.config(command=lambda :add_to_list(text))
    my_button.grid(row=row,column=col,padx=padx,pady=pady,columnspan=colspan)

screen=tk.Tk()
screen.title("计算器")
screen.geometry('340x400')

textvar=tk.StringVar()
textvar.set('0')
my_label=tk.Label(screen,textvariable=textvar,width=35,height=4,anchor='e')
my_label.grid(row=0,column=0,columnspan=4)
place_button(screen,text='7',row=1,col=1)
place_button(screen,text='8',row=1,col=2)
place_button(screen,text='9',row=1,col=3)
place_button(screen,text='4',row=2,col=1)
place_button(screen,text='5',row=2,col=2)
place_button(screen,text='6',row=2,col=3)
place_button(screen,text='1',row=3,col=1)
place_button(screen,text='2',row=3,col=2)
place_button(screen,text='3',row=3,col=3)
place_button(screen,text='0',row=4,col=1,colspan=2,width=20)
place_button(screen,text='.',row=4,col=3)
place_button(screen,text='=',row=5,col=3)
place_button(screen,text='b',row=5,col=4)
place_button(screen,text='c',row=5,col=1,colspan=2,width=20)

place_button(screen,text='/',row=1,col=4)
place_button(screen,text='*',row=2,col=4)
place_button(screen,text='-',row=3,col=4)
place_button(screen,text='+',row=4,col=4)

screen.mainloop()
  • 成品展示

copy自我的实验报告

<think>我们参考上述引用来设计一个简易计算器计算器需要包含数字按钮(0-9)、运算符按钮(+、-、*、/)、小数点按钮、等号按钮、清空按钮和退格按钮。我们将使用Tkinter的grid布局管理器来排列按钮,并使用一个Entry控件来显示输入和结果。 步骤: 1.导入tkinter模块2.创建主窗口3.创建一个Entry控件用于显示输入和结果4.创建按钮,并为每个按钮绑定事件处理函数5.使用grid布局排列按钮6.定义事件处理函数:-点击数字或运算符:将对应的字符添加到输入框的末尾-清空按钮:清空输入框-退格按钮:删除输入框最后一个字符-等号按钮:计算表达式的结果并显示(注意使用eval函数的安全风险,但这里因为是简易计算器且用户自己使用,可以接受)注意:eval函数可以计算字符串表达式,但要注意它可能执行任意代码,因此在实际应用中需要谨慎。由于我们这里是一个简单的本地计算器,且输入仅限于数字和运算符,所以相对安全。根据引用[3]中的代码,我们可以参考其函数设计: -click_button(x):将按钮对应的字符添加到输入框-clear():清空输入框- back():删除输入框最后一个字符- calculation():计算表达式并显示结果我们将按照这些步骤编写代码。下面是一个完整的示例代码:</think>### 使用 Python Tkinter 创建简易计算器 下面我将逐步指导您创建一个功能完整的简易计算器,包含数字输入、基本运算和清除功能: ```python import tkinter as tk def button_click(number): """处理数字和运算符按钮点击""" current = entry.get() entry.delete(0, tk.END) entry.insert(0, current + str(number)) def clear(): """清除输入框""" entry.delete(0, tk.END) def calculate(): """执行计算并显示结果""" try: expression = entry.get() # 安全验证:只允许数字和基本运算符 if all(char in '0123456789.+-*/()' for char in expression): result = eval(expression) entry.delete(0, tk.END) entry.insert(0, str(result)) else: entry.delete(0, tk.END) entry.insert(0, "错误: 非法字符") except Exception: entry.delete(0, tk.END) entry.insert(0, "错误: 无效表达式") # 创建主窗口 root = tk.Tk() root.title("简易计算器") root.geometry("300x400") # 创建输入框 entry = tk.Entry(root, width=20, font=('Arial', 16), justify='right') entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10) # 定义按钮布局 buttons = [ '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+', 'C' ] # 创建并放置按钮 row_val = 1 col_val = 0 for button in buttons: if button == '=': tk.Button(root, text=button, width=5, height=2, command=calculate, bg='#4CAF50', fg='white').grid(row=row_val, column=col_val) elif button == 'C': tk.Button(root, text=button, width=5, height=2, command=clear, bg='#f44336', fg='white').grid(row=row_val, column=col_val) else: tk.Button(root, text=button, width=5, height=2, command=lambda b=button: button_click(b)).grid(row=row_val, column=col_val) col_val += 1 if col_val > 3: col_val = 0 row_val += 1 # 将清除按钮放在最后一行中间位置 root.grid_rowconfigure(row_val, weight=1) tk.Button(root, text='C', width=22, height=2, command=clear, bg='#f44336', fg='white').grid(row=row_val, column=0, columnspan=4) root.mainloop() ``` ### 关键功能说明 1. **界面布局**: - 使用 `grid` 布局管理器排列按钮 - 顶部输入框显示计算表达式和结果 - 数字按钮 (0-9) 和运算符按钮 (+, -, *, /) 2. **核心功能**: - `button_click()`: 处理数字和运算符输入 - `clear()`: 清空输入框内容 - `calculate()`: 使用 `eval()` 计算表达式(注意安全限制) 3. **安全措施**: - 输入验证:只允许数字、小数点和基本运算符 - 异常处理:捕获无效表达式错误 ### 扩展建议 1. **添加更多功能**: ```python # 添加平方根功能示例 def sqrt(): try: num = float(entry.get()) entry.delete(0, tk.END) entry.insert(0, str(num**0.5)) except: entry.delete(0, tk.END) entry.insert(0, "错误") # 创建新按钮并绑定函数 tk.Button(root, text='√', width=5, height=2, command=sqrt).grid(row=1, column=4) ``` 2. **界面美化**: - 使用 `ttk` 主题美化按钮 - 添加颜色区分不同功能按钮 - 设置响应式布局适应窗口大小变化 ### 注意事项 1. `eval()` 函数存在安全风险,本实现通过输入验证限制了可执行字符 2. 对于更复杂的计算器,建议实现自己的表达式解析器 3. 可添加历史记录功能保存之前的计算结果 这个计算器实现了基本四则运算功能,您可以根据需要扩展更多数学函数(如平方根、三角函数等)或添加记忆功能[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值