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

TL;DR · AI 摘要
本文教你在Python中使用Tkinter库构建一个简单的算术计算器GUI,适合初学者入门图形界面开发。
核心要点
- 使用tk.Tk()初始化主窗口,并通过mainloop()保持窗口运行。
- 通过root.title()方法设置窗口标题为'Calculator'。
- 创建多个Frame容器来组织按钮布局,便于构建键盘式界面。
结构提纲
按章节快速跳转。
- §引言
介绍如何使用Tkinter在Python中构建一个简单的算术计算器GUI。
列出学习本教程所需的先决条件,包括基本的Python语法和模块使用知识。
描述将要构建的计算器的功能和界面要求。
展示如何导入Tkinter并初始化主窗口。
演示如何使用title()函数更改窗口标题。
讲解如何创建Frame容器以组织按钮布局。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 构建Tkinter计算器
- 准备工作
- 安装Python
- 检查Tkinter是否安装
- 窗口设置
- 导入Tkinter
- 初始化窗口
- 设置窗口标题
- 界面设计
- 创建Frame容器
- 添加按钮布局
- 实现功能逻辑
金句 / Highlights
值得收藏与分享的关键句。
Tkinter是Python的标准内置库,帮助我们创建图形用户界面。
要检查是否安装,可以在命令提示符中输入:python -m tkinter
标题栏上的'tk'是窗口的默认标题。
标题:如何使用 Python 的 Tkinter 构建计算器
来源网址:https://www.freecodecamp.org/news/build-a-calculator-with-tkinter-in-python/
发布时间:2026-05-15T13:31:40.372Z

在本教程中,你将学习如何使用 Tkinter 在 Python 中创建一个简单的算术计算器。这个项目将是你迈向在 Python 中构建实际 GUI 的第一步。
这是一个动手实践的教程,将帮助你形成早期的 GUI 项目。它适合任何想要开始在 Python 中构建可视化项目的人。
Tkinter 库是 Python 的标准内置库,它帮助我们在 Python 中创建图形用户界面。由于它是一个内置库,我们无需单独安装。因此,只要你的计算机上安装了 Python,只需设置一下,就可以跟着教程进行了。
但请注意,Tkinter 可能没有随你的 Python 发行版一起安装。要检查它是否已安装,请打开命令提示符并输入:
python -m tkinter如果 Tkinter 已安装并在你的计算机上正常工作,这将打开一个 Tkinter 示例窗口。
目录
先决条件
在开始之前,本教程有一些先决条件,这些将帮助你从中获得最大收益:
- 基本的 Python 语法
- 了解如何导入和使用库及其不同函数
- 了解如何使用模块的不同属性
既然我们知道了进行本教程需要什么,现在让我们真正深入这个过程!
构建任何项目的第一步是明确你想要构建什么。让我们看看我们将要制作什么。
我们的项目中希望看到什么?
我们将构建一个简单的算术计算器。计算器的工作方式如下:
- 它有一个包含所有数字(0, 1, 2, ..., 9)的键盘。
- 它有基本的算术运算符(+, -, /, *, =)排列在键盘上。
- 计算器不可调整大小,即用户无法扩展应用程序窗口的宽度或高度。
- 计算器在键盘上方有一个屏幕,显示用户输入和最终答案。
- 最后,计算器有一个“AC”按钮,代表“全部清除”,它会擦除窗口输出屏幕上的所有内容,并允许用户再次使用。
有了这些,我们就清楚地知道我们要构建什么了。
此外,你可以预先创建 UI,并相应地将小部件放置在窗口上。以下是我们将在本教程中创建的 UI 图片:

如何设置窗口
要设置我们的主窗口(稍后我们将在其中添加小部件),首先我们需要将 Tkinter 库导入到我们的程序中。然后我们将使用 tk.Tk() 函数初始化窗口。为了持续在屏幕上显示窗口,直到我们手动退出,我们将使用 mainloop() 函数。代码如下所示:
import tkinter as tk
# 屏幕初始化
root = tk.Tk()
# 这使窗口保持活动状态
root.mainloop()root 变量代表我们的窗口。因此,从现在开始,我们将向这个窗口添加小部件。
当用户点击“运行”时,你将在屏幕上看到一个空白窗口,如下图所示。恭喜!这是你的第一个 GUI。

如何命名窗口
标题栏上的“tk”是窗口的默认标题。要设置我们自己的窗口标题,我们可以使用 title() 函数。以下代码展示了如何做到这一点:
import tkinter as tk
root = tk.Tk()
# 命名窗口
root.title("Calculator")
root.mainloop()执行程序后,我们得到以下窗口:

现在你应该能看到窗口的标题已成功更改。
如何在窗口中创建框架
设置好窗口后,现在我们需要在上面放置按钮。为了放置按钮,我们需要创建一个容器来放置它们。
容器可以是主窗口,但在这个项目中我们会避免这样做。这是因为我们想要将一些按钮放置在其他按钮的旁边和下方,以创建我们的键盘。为了简化操作,我们将创建框架容器。
框架容器代表窗口的一个垂直列。框架的初始尺寸是 0 x 0。当我们在其中放置小部件时,框架会相应地调整大小。
我们将在窗口中创建四个框架。第一个框架将包含按钮 1、4、7 和 AC。第二个框架将包含按钮 2、5、8 和 0,第三个框架将包含按钮 3、6、9 和 =,最后一个框架将包含按钮 +、-、x 和 /(就像上面显示的 UI 一样)。
我们可以使用 tk.Frame() 在 Tkinter 中创建框架。我们将在其参数中传递框架的父容器——即主窗口。以下代码应该能说明这一点:
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: 此参数允许我们将命令链接到按钮。
现在我们了解了创建按钮的基础知识,让我们实际创建计算器的键盘。
要创建键盘,我们需要在窗口上放置相当多的按钮。为了使我们的工作更容易,我们将定义一个函数来创建按钮,只需使用不同的文本。让我们看看下面的代码:
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 按钮。
当我们执行程序时,将弹出以下窗口:

您可以尝试点击按钮,以确保到目前为止一切正常。
如何添加计算器的输出屏幕
对于计算器的输出屏幕,我们将使用 Tkinter 中的 Entry 对象。在这种情况下,Entry 对象将是最佳匹配,因为我们只需要一个单行屏幕来展示用户输入。我们也可以使用 Text 对象,但它提供了一个多行区域。所以这里,我们将只使用 Entry 对象。
此外,由于我们希望输出屏幕位于键盘上方,我们需要在嵌入 Frame 之前定义并嵌入此对象。
Entry 对象是使用 tk.Entry() 函数创建的。它具有与 tk.Button() 函数相似的参数。以下代码创建了一个输入框:
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))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 界面如下所示:

我们可以看到输出屏幕设置得很完美。
如何在输出屏幕上显示数字
下一步是让字符在输出屏幕上可见。我们点击的每个按钮都应该在输出屏幕上显示。为此,我们需要为每个按钮链接命令。我们先看代码,然后了解它的工作原理:
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() 函数,并在输出屏幕上显示被按下的按钮字符。
现在尝试点击窗口中的一些按钮。它们应该会如下所示出现在输出屏幕上:

现在,你可能遇到了一个问题:当你输入大量字符时,只能看到前几个字符,其余的都不可见。
为了解决这个问题,我们将在输出屏幕上添加一个滚动条。
首先,我们将在 entry 对象之前通过 tk.Scrollbar() 创建一个滚动条对象。以下代码展示了如何操作:
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 对象,并将滚动条嵌入到输出屏幕中。
下图显示了滚动条。你可以使用箭头符号在文本中向前或向后导航:

如何添加等号按钮
我们还没有制作 等号 按钮——现在让我们来完成它。首先,我们将定义一个名为 cmd_equal() 的函数。在这个函数中,我们首先将 entry 的 state 改为 normal。然后使用 entry.get() 函数提取输出屏幕中的文本,并将 'x' 替换为 '*'。我们这样做是因为乘法是用 '*' 而不是 'x' 表示的。
然后我们将添加一个 try-except 块。我们将尝试使用 Python 内置的 eval() 函数来评估我们提取的数学表达式。如果表达式无效,我们不会抛出错误,而是在屏幕上输出 'Invalid'。
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()
这里,我们还使用了 `entry.delete()` 函数。该函数会从第一个参数的索引(即第 0 个索引)开始,删除输出屏幕上的所有文本,直到最后一个参数的索引,也就是文本的末尾(用 `tk.END` 表示)。
然后,我们使用 `entry.insert()` 将结果插入到输出屏幕上。需要注意的是,我们将 `等号` 按钮嵌入到了 `btn9` 定义下方的同一框架中。这样,`等号` 按钮就被放置在了合适的位置。
以下图片分别展示了初始界面和最终界面。

点击等号按钮后:

## 如何添加 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()
当我们运行代码时,应该会显示最终的项目。
## 总结
现在你已经学会了如何构建一个简单的算术计算器。为了巩固并扩展你在这里学到的概念,你可以尝试为这个计算器添加更多功能。以下是一些建议,供你练习所学内容:
* 添加小数点按钮,允许用户处理小数。
* 添加百分比按钮,允许用户计算百分比。
* 添加删除按钮,使其可以逐个删除字符,而不是清空整个屏幕。
* 使计算器支持“计算机键盘交互”,即允许直接从计算机键盘输入。(提示:将 `entry` 对象的 `state` 改为 `normal`,并为“无效”表达式添加条件)。
感谢阅读!
* * *
* * *
免费学习编程。freeCodeCamp 的开源课程已帮助超过 40,000 人获得开发者工作。[立即开始](https://www.freecodecamp.org/learn)