杰瑞科技汇

tkinter计算器如何实现基础运算功能?

  1. 导入 Tkinter 库
  2. 创建主窗口
  3. 定义变量:用于存储当前输入的数字和计算结果。
  4. 创建显示区域:一个 Entry 组件,用于显示输入和结果。
  5. 创建按钮:数字按钮 (0-9)、运算符按钮 (+, -, *, /)、功能按钮 (C, +/-, ., =)。
  6. 编写按钮事件处理函数:处理数字输入、运算、清除和计算等逻辑。
  7. 布局:使用 grid() 管理器将按钮和显示区域排列整齐。

完整代码

这是完整的计算器代码,你可以直接复制并运行它。

tkinter计算器如何实现基础运算功能?-图1
(图片来源网络,侵删)
import tkinter as tk
from tkinter import font
# --- 1. 创建主窗口 ---
window = tk.Tk()
window.title("Python Tkinter 计算器")
window.geometry("350x500")  # 设置窗口大小
window.resizable(False, False)  # 禁止调整窗口大小
# --- 2. 定义变量 ---
current_input = tk.StringVar()
current_input.set("0")  # 初始显示为0
# --- 3. 创建显示区域 ---
display_font = font.Font(family="Helvetica", size=24)
display = tk.Entry(window, textvariable=current_input, font=display_font, bd=10, insertwidth=2, width=14, borderwidth=4, justify="right")
display.grid(row=0, column=0, columnspan=4)
# --- 4. 按钮布局和事件处理 ---
# 按钮的通用样式
button_font = font.Font(family="Helvetica", size=18)
button_style = {'font': button_font, 'width': 5, 'height': 2}
# 定义按钮的布局和对应的命令
buttons = [
    ('C', 1, 0, 'clear_all'),      # 清除全部
    ('⌫', 1, 1, 'backspace'),    # 退格
    ('±', 1, 2, 'toggle_sign'),   # 正负号
    ('/', 1, 3, 'operator'),      # 除法
    ('7', 2, 0, 'number'),        # 数字7
    ('8', 2, 1, 'number'),
    ('9', 2, 2, 'number'),
    ('*', 2, 3, 'operator'),      # 乘法
    ('4', 3, 0, 'number'),        # 数字4
    ('5', 3, 1, 'number'),
    ('6', 3, 2, 'number'),
    ('-', 3, 3, 'operator'),      # 减法
    ('1', 4, 0, 'number'),        # 数字1
    ('2', 4, 1, 'number'),
    ('3', 4, 2, 'number'),
    ('+', 4, 3, 'operator'),      # 加法
    ('0', 5, 0, 'number'),        # 数字0 (占两列)
    ('.', 5, 2, 'decimal'),       # 小数点
    ('=', 5, 3, 'calculate')      # 等号
]
# --- 5. 创建按钮并绑定事件 ---
for (text, row, col, command_type) in buttons:
    # 特殊处理数字0,让它占据两列
    if text == '0':
        btn = tk.Button(window, text=text, **button_style, command=lambda t=text: button_click(t))
        btn.grid(row=row, column=col, columnspan=2, sticky="nsew")
    else:
        btn = tk.Button(window, text=text, **button_style, command=lambda t=text, cmd=command_type: button_action(t, cmd))
        btn.grid(row=row, column=col, sticky="nsew")
# 让按钮可以拉伸填充空间
for i in range(5): # 5行
    window.grid_rowconfigure(i, weight=1)
for i in range(4): # 4列
    window.grid_columnconfigure(i, weight=1)
# --- 6. 事件处理函数 ---
def button_action(text, action_type):
    """处理所有按钮的通用逻辑"""
    current_value = current_input.get()
    if action_type == 'number':
        # 如果当前显示是0或者是一个结果(以=,则新数字覆盖旧显示
        if current_value == "0" or current_value.endswith('='):
            current_input.set(text)
        else:
            current_input.set(current_value + text)
    elif action_type == 'operator':
        # 如果上一个输入是运算符,则替换它
        if current_value[-1] in '+-*/':
            current_input.set(current_value[:-1] + text)
        else:
            current_input.set(current_value + text)
    elif action_type == 'decimal':
        # 防止出现多个小数点
        if '.' not in current_value.split()[-1].split('+')[-1].split('-')[-1].split('*')[-1].split('/')[-1]:
            current_input.set(current_value + text)
    elif action_type == 'clear_all':
        current_input.set("0")
    elif action_type == 'backspace':
        if len(current_value) > 1:
            current_input.set(current_value[:-1])
        else:
            current_input.set("0")
    elif action_type == 'toggle_sign':
        if current_value != "0":
            if current_value.startswith('-'):
                current_input.set(current_value[1:])
            else:
                current_input.set('-' + current_value)
    elif action_type == 'calculate':
        try:
            # 使用 eval() 计算表达式(注意:在生产环境中使用 eval 有安全风险,但在此处作为演示是安全的)
            expression = current_value
            # 移除可能存在的等号
            if '=' in expression:
                expression = expression.split('=')[0]
            result = eval(expression)
            # 格式化结果,如果结果是整数则不显示小数点
            if isinstance(result, int) or result.is_integer():
                current_input.set(f"{int(result)}=")
            else:
                current_input.set(f"{result}=")
        except (SyntaxError, ZeroDivisionError):
            current_input.set("Error=")
# --- 7. 启动主循环 ---
window.mainloop()

代码详解

导入库和创建窗口

import tkinter as tk
from tkinter import font
window = tk.Tk()
window.title("Python Tkinter 计算器")
window.geometry("350x500")
window.resizable(False, False)
  • tkinter 是 Python 的标准 GUI 库。
  • font 模块用于自定义字体样式,让计算器看起来更美观。
  • tk.Tk() 创建一个主窗口。)` 设置窗口标题。
  • geometry() 设置窗口的初始大小。
  • resizable(False, False) 锁定窗口大小,防止用户拉伸变形。

定义变量

current_input = tk.StringVar()
current_input.set("0")
  • tk.StringVar() 是 Tkinter 中用于与 EntryLabel 等组件绑定的特殊字符串变量。
  • current_input 的值改变时,绑定了它的 Entry 组件会自动更新显示,这是实现界面动态更新的核心。

创建显示区域

display_font = font.Font(family="Helvetica", size=24)
display = tk.Entry(window, textvariable=current_input, font=display_font, bd=10, insertwidth=2, width=14, borderwidth=4, justify="right")
display.grid(row=0, column=0, columnspan=4)
  • tk.Entry 是单行文本输入框,我们用它来显示计算器的输入和输出。
  • textvariable=current_input:将 Entry 的显示内容与 current_input 变量绑定。
  • font=display_font:应用我们自定义的大号字体。
  • justify="right":文本靠右对齐,符合计算器的使用习惯。
  • grid(row=0, column=0, columnspan=4):使用 grid 布局管理器,将显示区域放在第0行,跨越4列,这样它就能占据整个顶部。

按钮布局和创建

buttons = [
    ('C', 1, 0, 'clear_all'),
    # ... 其他按钮
]
for (text, row, col, command_type) in buttons:
    if text == '0':
        # 0按钮特殊处理
    else:
        btn = tk.Button(window, text=text, **button_style, command=lambda t=text, cmd=command_type: button_action(t, cmd))
        btn.grid(row=row, column=col, sticky="nsew")
  • 我们使用一个列表 buttons 来定义所有按钮的属性:显示文本、所在行、所在列和命令类型,这使得代码结构清晰,易于修改。
  • 在循环中,我们为每个按钮创建一个 tk.Button 组件。
  • command=...:指定按钮被点击时要执行的函数,这里我们使用了一个 lambda 函数,因为它可以传递参数(按钮的文本和命令类型)给 button_action 函数。
  • sticky="nsew":让按钮在网格单元中拉伸,填满整个空间。
  • window.grid_rowconfigurewindow.grid_columnconfigure:让网格的行和列可以按比例拉伸,这样窗口大小变化时,按钮也能自适应。

事件处理函数 button_action

这是计算器的核心逻辑。

  • button_click(text): 处理数字输入,它会检查当前显示,如果显示是 "0" 或一个计算结果,就新数字覆盖,否则就在现有数字后追加。
  • button_action(text, action_type): 处理其他所有操作。
    • operator: 处理 , , , ,它会检查上一个字符是否也是运算符,如果是,就替换掉,避免出现连续运算符。
    • decimal: 处理 ,它会检查当前数字部分是否已经有小数点,防止输入多个小数点。
    • clear_all: 将显示重置为 "0"。
    • backspace: 删除最后一个字符。
    • toggle_sign: 切换正负号。
    • calculate: 这是计算功能。
      • 它使用 eval() 函数来计算字符串表达式。eval() 会执行一个字符串形式的 Python 表达式。
      • 注意eval() 在处理来自不可信来源的输入时存在安全风险,因为我们的计算器所有输入都来自代码内部定义的按钮,所以这里是安全的。
      • 计算后,它会将结果格式化(如果是整数就去掉 .0),并在末尾加上 号,表示计算完成。

如何运行代码

  1. 将上面的完整代码复制到一个文本编辑器中。
  2. 将文件保存为 calculator.py
  3. 打开终端或命令提示符。
  4. 运行命令:python calculator.py
  5. 一个计算器窗口就会出现,你可以开始使用了!

这个计算器功能完整,代码结构清晰,是学习 Tkinter GUI 编程的一个非常好的实践项目。

tkinter计算器如何实现基础运算功能?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇