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 frame1 和 frame2 不会重叠。相反,frame2 会占据一个位置,使其在不与 frame1 重叠的情况下尽可能靠左。因此,Frame frame1、frame2、frame3 和 frame4 在窗口左侧并排排列。

如何向窗口添加按钮

我们可以使用 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 对象的 width 和 height 参数来更改按钮的大小。

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

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

然后我们使用这两个函数创建了所有按钮。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。在函数内部,我们通过 config 将 entry 对象的 state 改为 normal。通过这样做,我们现在可以修改 entry 对象的文本内容。

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

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

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

现在让我们看看 buttons 和 buttons_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() 的函数。在这个函数中,我们首先将 entry 的 state 改为 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)