freeCodeCamp.org

如何用Tkinter在Python中构建计算器

7.0内容质量
如何用Tkinter在Python中构建计算器

TL;DR · AI 摘要

本文教你在Python中使用Tkinter库构建一个简单的算术计算器GUI,适合初学者入门图形界面开发。

核心要点

  • 使用tk.Tk()初始化主窗口,并通过mainloop()保持窗口运行。
  • 通过root.title()方法设置窗口标题为'Calculator'。
  • 创建多个Frame容器来组织按钮布局,便于构建键盘式界面。

结构提纲

按章节快速跳转。

  1. 介绍如何使用Tkinter在Python中构建一个简单的算术计算器GUI。

  2. 列出学习本教程所需的先决条件,包括基本的Python语法和模块使用知识。

  3. 描述将要构建的计算器的功能和界面要求。

  4. 展示如何导入Tkinter并初始化主窗口。

  5. 演示如何使用title()函数更改窗口标题。

  6. 讲解如何创建Frame容器以组织按钮布局。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 构建Tkinter计算器
    • 准备工作
      • 安装Python
      • 检查Tkinter是否安装
    • 窗口设置
      • 导入Tkinter
      • 初始化窗口
      • 设置窗口标题
    • 界面设计
      • 创建Frame容器
      • 添加按钮布局
      • 实现功能逻辑

金句 / Highlights

值得收藏与分享的关键句。

#Tkinter#Python#GUI开发
打开原文

标题:如何使用 Python 的 Tkinter 构建计算器

来源网址:https://www.freecodecamp.org/news/build-a-calculator-with-tkinter-in-python/

发布时间:2026-05-15T13:31:40.372Z

图片 1:如何使用 Python 的 Tkinter 构建计算器
图片 1:如何使用 Python 的 Tkinter 构建计算器

在本教程中,你将学习如何使用 Tkinter 在 Python 中创建一个简单的算术计算器。这个项目将是你迈向在 Python 中构建实际 GUI 的第一步。

这是一个动手实践的教程,将帮助你形成早期的 GUI 项目。它适合任何想要开始在 Python 中构建可视化项目的人。

Tkinter 库是 Python 的标准内置库,它帮助我们在 Python 中创建图形用户界面。由于它是一个内置库,我们无需单独安装。因此,只要你的计算机上安装了 Python,只需设置一下,就可以跟着教程进行了。

但请注意,Tkinter 可能没有随你的 Python 发行版一起安装。要检查它是否已安装,请打开命令提示符并输入:

code
python -m tkinter

如果 Tkinter 已安装并在你的计算机上正常工作,这将打开一个 Tkinter 示例窗口。

目录

先决条件

在开始之前,本教程有一些先决条件,这些将帮助你从中获得最大收益:

  • 基本的 Python 语法
  • 了解如何导入和使用库及其不同函数
  • 了解如何使用模块的不同属性

既然我们知道了进行本教程需要什么,现在让我们真正深入这个过程!

构建任何项目的第一步是明确你想要构建什么。让我们看看我们将要制作什么。

我们的项目中希望看到什么?

我们将构建一个简单的算术计算器。计算器的工作方式如下:

  • 它有一个包含所有数字(0, 1, 2, ..., 9)的键盘。
  • 它有基本的算术运算符(+, -, /, *, =)排列在键盘上。
  • 计算器不可调整大小,即用户无法扩展应用程序窗口的宽度或高度。
  • 计算器在键盘上方有一个屏幕,显示用户输入和最终答案。
  • 最后,计算器有一个“AC”按钮,代表“全部清除”,它会擦除窗口输出屏幕上的所有内容,并允许用户再次使用。

有了这些,我们就清楚地知道我们要构建什么了。

此外,你可以预先创建 UI,并相应地将小部件放置在窗口上。以下是我们将在本教程中创建的 UI 图片:

图片 2:计算器的 UI
图片 2:计算器的 UI

如何设置窗口

要设置我们的主窗口(稍后我们将在其中添加小部件),首先我们需要将 Tkinter 库导入到我们的程序中。然后我们将使用 tk.Tk() 函数初始化窗口。为了持续在屏幕上显示窗口,直到我们手动退出,我们将使用 mainloop() 函数。代码如下所示:

code
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 这使窗口保持活动状态
root.mainloop()

root 变量代表我们的窗口。因此,从现在开始,我们将向这个窗口添加小部件。

当用户点击“运行”时,你将在屏幕上看到一个空白窗口,如下图所示。恭喜!这是你的第一个 GUI。

图片 3:空白的 Tkinter 窗口
图片 3:空白的 Tkinter 窗口

如何命名窗口

标题栏上的“tk”是窗口的默认标题。要设置我们自己的窗口标题,我们可以使用 title() 函数。以下代码展示了如何做到这一点:

code
import tkinter as tk

root = tk.Tk()

# 命名窗口
root.title("Calculator")

root.mainloop()

执行程序后,我们得到以下窗口:

图片 4:标题更改为 'Calculator' 的空白窗口
图片 4:标题更改为 'Calculator' 的空白窗口

现在你应该能看到窗口的标题已成功更改。

如何在窗口中创建框架

设置好窗口后,现在我们需要在上面放置按钮。为了放置按钮,我们需要创建一个容器来放置它们。

容器可以是主窗口,但在这个项目中我们会避免这样做。这是因为我们想要将一些按钮放置在其他按钮的旁边和下方,以创建我们的键盘。为了简化操作,我们将创建框架容器。

框架容器代表窗口的一个垂直列。框架的初始尺寸是 0 x 0。当我们在其中放置小部件时,框架会相应地调整大小。

我们将在窗口中创建四个框架。第一个框架将包含按钮 1、4、7 和 AC。第二个框架将包含按钮 2、5、8 和 0,第三个框架将包含按钮 3、6、9 和 =,最后一个框架将包含按钮 +、-、x 和 /(就像上面显示的 UI 一样)。

我们可以使用 tk.Frame() 在 Tkinter 中创建框架。我们将在其参数中传递框架的父容器——即主窗口。以下代码应该能说明这一点:

code
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 命名窗口
root.title("Calculator")

# 创建框架
frame1 = tk.Frame(root)
frame1.pack(side='left', anchor='n')
frame2 = tk.Frame(root)
frame2.pack(side='left', anchor='n')
frame3 = tk.Frame(root)
frame3.pack(side='left', anchor='n')
frame4 = tk.Frame(root)
frame4.pack(side='left', anchor='n')

# 这使窗口保持活动状态
root.mainloop()

pack() 函数将 Frame 几何嵌入到窗口中。side='left' 参数将 Frame 嵌入到屏幕的最左侧,默认情况下是居中。anchor='n' 表示小部件应从 Frame 的顶部开始放置,默认情况下小部件从 Frame 的中心开始添加。anchor='n' 中的 'n' 代表 'North'(北)。

需要注意的重要一点是,由于我们在程序中较早定义了 frame1,它将占据窗口的最左侧部分。但即使 frame2 也被设置为占据最左侧,两个 Frame frame1frame2 不会重叠。相反,frame2 会占据一个位置,使其在不与 frame1 重叠的情况下尽可能靠左。因此,Frame frame1frame2frame3frame4 在窗口左侧并排排列。

如何向窗口添加按钮

我们可以使用 tk.Button() 函数在 Tkinter 中创建按钮小部件。tk.Button() 函数包含多个参数:

  • master: 此参数允许我们提供放置按钮的父容器,需要一个容器对象。
  • text: 在此参数中,我们需要传递要在按钮上显示的文本,需要一个字符串。
  • font: 此参数需要一个元组,第一个元素提供字体名称,下一个元素提供字体大小。
  • image: 此参数允许我们在按钮上放置图像。
  • bg: 此参数允许我们设置按钮的背景颜色。
  • fg: 此参数允许我们设置按钮的前景颜色。
  • activebackground: 当按钮被点击时,此参数中传递的颜色将变为可见。
  • command: 此参数允许我们将命令链接到按钮。

现在我们了解了创建按钮的基础知识,让我们实际创建计算器的键盘。

要创建键盘,我们需要在窗口上放置相当多的按钮。为了使我们的工作更容易,我们将定义一个函数来创建按钮,只需使用不同的文本。让我们看看下面的代码:

code
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 命名窗口
root.title("计算器")

frame1 = tk.Frame(root)
frame1.pack(side='left', anchor='n')
frame2 = tk.Frame(root)
frame2.pack(side='left', anchor='n')
frame3 = tk.Frame(root)
frame3.pack(side='left', anchor='n')
frame4 = tk.Frame(root)
frame4.pack(side='left', anchor='n')

pixel = tk.PhotoImage(width=55, height=55)

def buttons(text, frame):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg="#333300", fg="white", compound="center")
    return button

def buttons_ops(text, frame, bg, fg):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg=bg, fg=fg, activebackground="black",
                        compound="center")
    return button

btn1 = buttons('1',frame1).pack()
btn4 = buttons('4', frame1).pack()
btn7 = buttons('7', frame1).pack()

btn2 = buttons('2', frame2).pack()
btn5 = buttons('5', frame2).pack()
btn8 = buttons('8', frame2).pack()
btn0 = buttons_ops('0', frame2, '#333300', 'white').pack()

plus = buttons_ops('+', frame4, 'black', 'white').pack()
minus= buttons_ops('-', frame4,  'black', 'white').pack()
mul = buttons_ops('x', frame4, 'black', 'white').pack()
div = buttons_ops('/', frame4, 'black', 'white').pack()

btn3 = buttons('3', frame3).pack()
btn6 = buttons('6', frame3).pack()
btn9 = buttons('9', frame3).pack()

# 保持窗口活动
root.mainloop()

现在我们来分解一下:

首先,我们通过 tk.PhotoImage() 创建了一个 Tkinter 图像对象。这是一个透明图像。创建此图像的目的是以像素为单位设置按钮的精确宽度和高度。compound='center' 确保按钮文本在透明图像上居中对齐。

您可以通过更改 pixel 对象的 widthheight 参数来更改按钮的大小。

其次,我们创建了一个函数,该函数接受 'text' 和 'container frame' 作为参数。在函数内部,我们创建了一个按钮对象并返回它。对于数字按钮,我们创建了函数 buttons,而对于运算符按钮,我们创建了函数 buttons_ops。这样做只是为了确保按钮具有不同的样式(在背景色、前景色等方面)。

您可以通过更改 tk.Button() 函数中的 bgfg 参数来更改按钮的颜色。

然后我们使用这两个函数创建了所有按钮。pack() 函数将按钮放置在它们各自的位置。请记住,我们还没有创建 =AC 按钮。

当我们执行程序时,将弹出以下窗口:

图片 5:嵌入了按钮的窗口
图片 5:嵌入了按钮的窗口

您可以尝试点击按钮,以确保到目前为止一切正常。

如何添加计算器的输出屏幕

对于计算器的输出屏幕,我们将使用 Tkinter 中的 Entry 对象。在这种情况下,Entry 对象将是最佳匹配,因为我们只需要一个单行屏幕来展示用户输入。我们也可以使用 Text 对象,但它提供了一个多行区域。所以这里,我们将只使用 Entry 对象。

此外,由于我们希望输出屏幕位于键盘上方,我们需要在嵌入 Frame 之前定义并嵌入此对象。

Entry 对象是使用 tk.Entry() 函数创建的。它具有与 tk.Button() 函数相似的参数。以下代码创建了一个输入框:

code
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 命名窗口
root.title("计算器")

# 创建输出屏幕
entry = tk.Entry(root, width=9, font=('Arial', 38, 'bold'), state='readonly')
entry.pack(pady=(30, 10))
python
frame1 = tk.Frame(root)
frame1.pack(side='left', anchor='n')
frame2 = tk.Frame(root)
frame2.pack(side='left', anchor='n')
frame3 = tk.Frame(root)
frame3.pack(side='left', anchor='n')
frame4 = tk.Frame(root)
frame4.pack(side='left', anchor='n')

pixel = tk.PhotoImage(width=55, height=55)

def buttons(text, frame):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg="#333300", fg="white", compound="center")
    return button

def buttons_ops(text, frame, bg, fg):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg=bg, fg=fg, activebackground="black",
                        compound="center")
    return button

btn1 = buttons('1',frame1).pack()
btn4 = buttons('4', frame1).pack()
btn7 = buttons('7', frame1).pack()

btn2 = buttons('2', frame2).pack()
btn5 = buttons('5', frame2).pack()
btn8 = buttons('8', frame2).pack()
btn0 = buttons_ops('0', frame2, '#333300', 'white').pack()

plus = buttons_ops('+', frame4, 'black', 'white').pack()
minus= buttons_ops('-', frame4,  'black', 'white').pack()
mul = buttons_ops('x', frame4, 'black', 'white').pack()
div = buttons_ops('/', frame4, 'black', 'white').pack()

btn3 = buttons('3', frame3).pack()
btn6 = buttons('6', frame3).pack()
btn9 = buttons('9', frame3).pack()

# 保持窗口活动状态
root.mainloop()

在上面的代码中,我们将 entry 对象的父容器设置为主窗口 root。我将 width 参数设置为 9,因为它与窗口和键盘的尺寸很匹配。你可以尝试不同的宽度值,设置一个完美尺寸的输出屏幕。

你可能注意到我们没有在对象定义的同一行使用 pack()。这是因为在对象定义的同一行使用 pack() 是不好的做法,它会限制某些功能。

那么,为什么我们在创建按钮时在同一行使用了 pack() 函数呢?这是因为在这个项目中我们没有大量操作按钮,所以尝试减少代码行数。

tk.Entry() 函数中,我们设置了 state='readonly'。这禁止了任何直接向输出屏幕输入文本的操作。这意味着我们只能使用按钮在输出屏幕上显示字符。默认情况下,这个参数设置为 state='normal',允许直接从键盘向输入框输入内容。

pack() 函数中的 pady 参数会在对象上下方留出指定数量的像素间距。要执行这样的操作,比如在对象两侧各填充 10 个像素,我们可以写成 pady=10

这里,我们不希望对象上下方的填充量相同。所以我们使用了一个元组,第一个元素表示输出屏幕上方的填充像素数,第二个元素表示输出屏幕下方的填充像素数。

到目前为止,我们的 GUI 界面如下所示:

Image 6: Window with embedded output screen
Image 6: Window with embedded output screen

我们可以看到输出屏幕设置得很完美。

如何在输出屏幕上显示数字

下一步是让字符在输出屏幕上可见。我们点击的每个按钮都应该在输出屏幕上显示。为此,我们需要为每个按钮链接命令。我们先看代码,然后了解它的工作原理:

python
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 命名窗口
root.title("Calculator")

entry = tk.Entry(root, width=9, font=('Arial', 38, 'bold'),state='readonly')
entry.pack(pady=(30, 10))

frame1 = tk.Frame(root)
frame1.pack(side='left', anchor='n')
frame2 = tk.Frame(root)
frame2.pack(side='left', anchor='n')
frame3 = tk.Frame(root)
frame3.pack(side='left', anchor='n')
frame4 = tk.Frame(root)
frame4.pack(side='left', anchor='n')

pixel = tk.PhotoImage(width=55, height=55)

def command(text):
    entry.config(state='normal')
    entry.insert(tk.END, text) 
    entry.config(state='readonly')  

def buttons(text, frame):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg="#333300", fg="white", compound="center",
                       command=lambda :command(text))
    return button

def buttons_ops(text, frame, bg, fg):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg=bg, fg=fg, activebackground="black",
                        compound="center", command=lambda:command(text))
    return button

btn1 = buttons('1',frame1).pack()
btn4 = buttons('4', frame1).pack()
btn7 = buttons('7', frame1).pack()

btn2 = buttons('2', frame2).pack()
btn5 = buttons('5', frame2).pack()
btn8 = buttons('8', frame2).pack()
btn0 = buttons_ops('0', frame2, '#333300', 'white').pack()

plus = buttons_ops('+', frame4, 'black', 'white').pack()
minus= buttons_ops('-', frame4,  'black', 'white').pack()
mul = buttons_ops('x', frame4, 'black', 'white').pack()
div = buttons_ops('/', frame4, 'black', 'white').pack()

btn3 = buttons('3', frame3).pack()
btn6 = buttons('6', frame3).pack()
btn9 = buttons('9', frame3).pack()

# 保持窗口活动状态
root.mainloop()

在上面的代码中,我们定义了一个名为 command() 的新函数。这个函数接受一个参数 text。在函数内部,我们通过 configentry 对象的 state 改为 normal。通过这样做,我们现在可以修改 entry 对象的文本内容。

然后我们对 entry 对象使用了 insert() 函数。insert() 函数将 text 参数追加到现有字符集的末尾。

insert() 函数的第一个参数指定文本插入的位置索引。tk.END 表示对象文本的最后一个字符位置。insert() 函数的第二个参数接受要插入的文本。

最后,我们再次将对象的 state 改为 readonly,以禁止除了我们定义的计算器键盘之外的任何外部输入。

现在让我们看看 buttonsbuttons_ops 函数。你可能已经注意到我们在 tk.Button() 函数中添加了 command 参数。lambda 告诉程序只有在按钮被点击时才执行命令。

总的来说,command=lambda:command(text) 意味着点击我们目前定义的按钮时,它会执行 command() 函数,并在输出屏幕上显示被按下的按钮字符。

现在尝试点击窗口中的一些按钮。它们应该会如下所示出现在输出屏幕上:

图片 7:计算器显示输入的屏幕图像
图片 7:计算器显示输入的屏幕图像

现在,你可能遇到了一个问题:当你输入大量字符时,只能看到前几个字符,其余的都不可见。

为了解决这个问题,我们将在输出屏幕上添加一个滚动条。

首先,我们将在 entry 对象之前通过 tk.Scrollbar() 创建一个滚动条对象。以下代码展示了如何操作:

code
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 命名窗口
root.title("Calculator")

scrollbar = tk.Scrollbar(root, orient='horizontal')

entry = tk.Entry(root, width=9, font=('Arial', 38, 'bold'), state='readonly', xscrollcommand=scrollbar.set)
entry.pack(pady=(30, 10))

scrollbar.config(command=entry.xview)
scrollbar.pack()

frame1 = tk.Frame(root)
frame1.pack(side='left', anchor='n')
frame2 = tk.Frame(root)
frame2.pack(side='left', anchor='n')
frame3 = tk.Frame(root)
frame3.pack(side='left', anchor='n')
frame4 = tk.Frame(root)
frame4.pack(side='left', anchor='n')

pixel = tk.PhotoImage(width=55, height=55)

def command(text):
    entry.config(state='normal')
    entry.insert(tk.END, text)
    entry.config(state='readonly')

def buttons(text, frame):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg="#333300", fg="white", compound="center",
                       command=lambda :command(text))
    return button

def buttons_ops(text, frame, bg, fg):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg=bg, fg=fg, activebackground="black",
                        compound="center", command=lambda:command(text))
    return button

btn1 = buttons('1',frame1).pack()
btn4 = buttons('4', frame1).pack()
btn7 = buttons('7', frame1).pack()

btn2 = buttons('2', frame2).pack()
btn5 = buttons('5', frame2).pack()
btn8 = buttons('8', frame2).pack()
btn0 = buttons_ops('0', frame2, '#333300', 'white').pack()

plus = buttons_ops('+', frame4, 'black', 'white').pack()
minus= buttons_ops('-', frame4,  'black', 'white').pack()
mul = buttons_ops('x', frame4, 'black', 'white').pack()
div = buttons_ops('/', frame4, 'black', 'white').pack()

btn3 = buttons('3', frame3).pack()
btn6 = buttons('6', frame3).pack()
btn9 = buttons('9', frame3).pack()

# 保持窗口活动
root.mainloop()

tk.Scrollbar() 对象中的 orient 参数决定了滚动条的性质。这里我们将其与 X 轴对齐。我们还在原始的 entry 对象中添加了一个参数。xscrollcommand 将滚动条设置到输出屏幕。

然后我们通过设置 command=entry.xview 将滚动条连接到 entry 对象,并将滚动条嵌入到输出屏幕中。

下图显示了滚动条。你可以使用箭头符号在文本中向前或向后导航:

图片 8:带有滚动条的计算器图像
图片 8:带有滚动条的计算器图像

如何添加等号按钮

我们还没有制作 等号 按钮——现在让我们来完成它。首先,我们将定义一个名为 cmd_equal() 的函数。在这个函数中,我们首先将 entrystate 改为 normal。然后使用 entry.get() 函数提取输出屏幕中的文本,并将 'x' 替换为 '*'。我们这样做是因为乘法是用 '*' 而不是 'x' 表示的。

然后我们将添加一个 try-except 块。我们将尝试使用 Python 内置的 eval() 函数来评估我们提取的数学表达式。如果表达式无效,我们不会抛出错误,而是在屏幕上输出 'Invalid'。

code
import tkinter as tk

# 屏幕初始化
root = tk.Tk()

# 命名窗口
root.title("Calculator")

scrollbar = tk.Scrollbar(root, orient='horizontal')

entry = tk.Entry(root, width=9, font=('Arial', 38, 'bold'), state='readonly', xscrollcommand=scrollbar.set)
entry.pack(pady=(30, 10))

scrollbar.config(command=entry.xview)
scrollbar.pack()

frame1 = tk.Frame(root)
frame1.pack(side='left', anchor='n')
frame2 = tk.Frame(root)
frame2.pack(side='left', anchor='n')
frame3 = tk.Frame(root)
frame3.pack(side='left', anchor='n')
frame4 = tk.Frame(root)
frame4.pack(side='left', anchor='n')

pixel = tk.PhotoImage(width=55, height=55)

def command(text):
    entry.config(state='normal')
    entry.insert(tk.END, text)
    entry.config(state='readonly')

def cmd_equal():
    entry.config(state='normal')
    txt = entry.get().replace('x', '*')

    try:
        result = eval(txt)

    except:
        result = 'INVALID'
    entry.delete(0, tk.END)
    entry.insert(tk.END, result)
    entry.config(state='readonly')   

def buttons(text, frame):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg="#333300", fg="white", compound="center",
                       command=lambda :command(text))
    return button

def buttons_ops(text, frame, bg, fg):
    button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg=bg, fg=fg, activebackground="black",
                        compound="center", command=lambda:command(text))
    return button

btn1 = buttons('1',frame1).pack()
btn4 = buttons('4', frame1).pack()
btn7 = buttons('7', frame1).pack()

btn2 = buttons('2', frame2).pack() btn5 = buttons('5', frame2).pack() btn8 = buttons('8', frame2).pack() btn0 = buttons_ops('0', frame2, '#333300', 'white').pack()

plus = buttons_ops('+', frame4, 'black', 'white').pack() minus= buttons_ops('-', frame4, 'black', 'white').pack() mul = buttons_ops('x', frame4, 'black', 'white').pack() div = buttons_ops('/', frame4, 'black', 'white').pack()

btn3 = buttons('3', frame3).pack() btn6 = buttons('6', frame3).pack() btn9 = buttons('9', frame3).pack() equal= tk.Button(frame3, text='=', font=('Arial', 20), image=pixel, bg='white', fg='black', activebackground="black", compound="center", command=lambda: cmd_equal()).pack()

保持窗口活动状态

root.mainloop()

code

这里,我们还使用了 `entry.delete()` 函数。该函数会从第一个参数的索引(即第 0 个索引)开始,删除输出屏幕上的所有文本,直到最后一个参数的索引,也就是文本的末尾(用 `tk.END` 表示)。

然后,我们使用 `entry.insert()` 将结果插入到输出屏幕上。需要注意的是,我们将 `等号` 按钮嵌入到了 `btn9` 定义下方的同一框架中。这样,`等号` 按钮就被放置在了合适的位置。

以下图片分别展示了初始界面和最终界面。

![图 9:显示数学表达式的计算器窗口](https://cdn.hashnode.com/uploads/covers/67e55054a0be57d730442ec0/8051ce51-5139-4668-97e2-b5c742c687a1.png)
点击等号按钮后:

![图 10:显示已计算数学表达式的计算器窗口](https://cdn.hashnode.com/uploads/covers/67e55054a0be57d730442ec0/1ddc6b4c-3e51-4237-b9f6-90986bff1963.png)
## 如何添加 AC 按钮

最后,我们将定义最后一个函数:`cmd_ac()`。这个函数会清除输出屏幕上的所有内容。我们将首先将 `state` 改为 `normal`,然后使用 `entry.delete()` 删除内容,最后将 `state` 改回 `readonly`。接着,我们将这个函数放入 `ac` 按钮的 `command()` 参数中。

为了防止窗口在扩展时界面混乱,我们将使用 `resizable()` 函数。该函数接受两个参数:一个控制是否允许调整宽度,另一个控制是否允许调整高度。为了禁止窗口扩展,我们将这两个参数都设置为 `False`。

因此,最终的代码如下:

import tkinter as tk

屏幕初始化

root = tk.Tk()

命名窗口

root.title("Calculator")

scrollbar = tk.Scrollbar(root, orient='horizontal')

entry = tk.Entry(root, width=9, font=('Arial', 38, 'bold'), state='readonly', xscrollcommand=scrollbar.set) entry.pack(pady=(30, 10))

scrollbar.config(command=entry.xview) scrollbar.pack()

frame1 = tk.Frame(root) frame1.pack(side='left', anchor='n') frame2 = tk.Frame(root) frame2.pack(side='left', anchor='n') frame3 = tk.Frame(root) frame3.pack(side='left', anchor='n') frame4 = tk.Frame(root) frame4.pack(side='left', anchor='n')

pixel = tk.PhotoImage(width=55, height=55)

def command(text): entry.config(state='normal') entry.insert(tk.END, text) entry.config(state='readonly')

def cmd_ac(): entry.config(state='normal') entry.delete(0, tk.END) entry.config(state='readonly')

def cmd_equal(): entry.config(state='normal') txt = entry.get().replace('x', '*')

try: result = eval(txt)

except: result = 'INVALID' entry.delete(0, tk.END) entry.insert(tk.END, result) entry.config(state='readonly')

def buttons(text, frame): button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg="#333300", fg="white", compound="center", command=lambda :command(text)) return button

def buttons_ops(text, frame, bg, fg): button = tk.Button(frame, text=text, font=('Arial', 20), image=pixel, bg=bg, fg=fg, activebackground="black", compound="center", command=lambda:command(text)) return button

btn1 = buttons('1',frame1).pack() btn4 = buttons('4', frame1).pack() btn7 = buttons('7', frame1).pack() ac = tk.Button(frame1, text="AC", font=('Arial', 20), image=pixel, bg="#666699", fg="white", compound="center", command=lambda: cmd_ac()).pack()

btn2 = buttons('2', frame2).pack() btn5 = buttons('5', frame2).pack() btn8 = buttons('8', frame2).pack() btn0 = buttons_ops('0', frame2, '#333300', 'white').pack()

plus = buttons_ops('+', frame4, 'black', 'white').pack() minus= buttons_ops('-', frame4, 'black', 'white').pack() mul = buttons_ops('x', frame4, 'black', 'white').pack() div = buttons_ops('/', frame4, 'black', 'white').pack()

btn3 = buttons('3', frame3).pack() btn6 = buttons('6', frame3).pack() btn9 = buttons('9', frame3).pack() equal= tk.Button(frame3, text='=', font=('Arial', 20), image=pixel, bg='white', fg='black', activebackground="black", compound="center", command=lambda: cmd_equal()).pack()

root.resizable(0,0)

保持窗口活动状态

root.mainloop()

code

当我们运行代码时,应该会显示最终的项目。

## 总结

现在你已经学会了如何构建一个简单的算术计算器。为了巩固并扩展你在这里学到的概念,你可以尝试为这个计算器添加更多功能。以下是一些建议,供你练习所学内容:

*   添加小数点按钮,允许用户处理小数。
*   添加百分比按钮,允许用户计算百分比。
*   添加删除按钮,使其可以逐个删除字符,而不是清空整个屏幕。
*   使计算器支持“计算机键盘交互”,即允许直接从计算机键盘输入。(提示:将 `entry` 对象的 `state` 改为 `normal`,并为“无效”表达式添加条件)。

感谢阅读!

* * *

* * *

免费学习编程。freeCodeCamp 的开源课程已帮助超过 40,000 人获得开发者工作。[立即开始](https://www.freecodecamp.org/learn)