在这个教程中,你将学习如何使用Tkinter在Python中创建一个简单的算术计算器。这个项目将是你开始用Python构建真正图形用户界面的第一步。
这是一个实践性很强的教程,它将帮助你完成早期的GUI项目开发。无论你是谁,只要想要开始用Python制作可视化应用程序,都可以学习这个教程。
Tkinter是Python内置的标准库,它能够帮助我们使用Python创建图形用户界面。由于它是内置库,所以我们不需要另外进行安装。因此,只要你的电脑上已经安装了Python,就可以直接开始学习这个教程了。
不过需要注意的是,你的Python可能并没有默认安装Tkinter。要检查是否已经安装了Tkinter,可以在命令提示符中输入以下命令:
python -m tkinter
如果Tkinter已经安装在你的电脑上并且可以正常使用,那么这个命令会打开一个Tkinter示例窗口。
目录
- 先决条件
- 我们的项目想要实现什么功能?
- 如何设置窗口
- 如何为窗口命名
- 如何在窗口中创建框架
- 如何向窗口中添加按钮
- 如何添加计算器的输出界面
- 如何让输出界面上的数字可见
- 如何为输出界面添加滚动条
- 如何添加“等于”按钮
- 如何添加“清除”按钮
- 总结
先决条件
在开始学习之前,以下是一些有助于你充分掌握这个教程内容的先决条件:
-
基本的Python语法知识
-
了解如何导入和使用各种库及其功能
-
知道如何使用模块中的不同属性
现在我们已经了解了学习这个教程需要具备哪些条件,那么就让我们正式开始吧!
构建任何项目的第一步都是明确自己想要实现什么目标。让我们来看看我们这次要制作的是什么。
我们的项目想要实现什么功能?
我们将构建一个简单的算术计算器。这个计算器的工作原理如下:
-
它的键盘上包含了所有的数字(0、1、2……9)。
-
键盘上还标有基本的算术运算符号(+、-、/、*、=)。
-
这个计算器不允许用户调整窗口的宽度或高度。
-
计算器的键盘上方有一个显示屏,用于显示用户输入的内容以及最终的计算结果。
-
最后,计算器还有一个“AC”按钮,点击该按钮可以清除显示屏上的所有内容,使用户能够再次使用计算器。
通过这些信息,我们对所要构建的这个计算器有了清晰的认识。
另外,你也可以提前设计好用户界面,并将各个组件放置在窗口中相应的位置。下面是我们在这个教程中将要创建的用户界面的图片:

如何设置窗口
首先,我们需要将Tkinter库导入到我们的程序中,然后使用tk.Tk()函数来初始化窗口。为了使窗口持续显示在屏幕上,直到我们手动关闭它,我们需要使用mainloop()函数。以下是相应的代码:
import tkinter as tk
# 初始化窗口
root = tk.Tk()
# 保持窗口处于活动状态
root.mainloop()
root变量代表我们的窗口,从现在开始,我们将在这个窗口中添加各种组件。
当用户点击“运行”按钮时,你会在屏幕上看到一个空白的窗口,如下图所示。恭喜!这就是你的第一个图形用户界面。

如何为窗口命名
标题栏上显示的“tk”是窗口的默认名称。如果我们想要自定义窗口的名称,可以使用title()函数。以下代码演示了如何进行操作:
import tkinter as tk
root = tk.Tk()
# 为窗口命名
root.title("计算器")
root.mainloop()
运行程序后,我们会得到如下所示的窗口:

现在你应该可以看到,窗口的名称已经成功被修改了。
如何在窗口中创建框架
在设置好窗口之后,接下来我们需要将按钮放置到窗口中。为了放置这些按钮,我们首先需要创建一个容器来容纳它们。
这个容器可以是主窗口本身,但在这个项目中我们不会采用这种做法。这是因为我们希望将一些按钮放置在其他按钮的旁边或下方,从而构建出我们的键盘界面。为了方便操作,我们会创建专门的框架容器。
框架容器代表窗口中的一列垂直布局区域。初始状态下,这样的框架的大小为0 x 0;当我们向其中添加组件时,框架的大小会相应地发生变化。
我们将在窗口中创建四个框架。第一个框架将用于放置按钮1、4、7和AC;第二个框架用于放置按钮2、5、8和0;第三个框架用于放置按钮3、6、9和=;最后一个框架则用于放置按钮+、-、x和/(与上面展示的用户界面布局相同)。
在Tkinter中,我们可以使用tk.Frame()函数来创建框架。我们需要为这个框架指定一个父容器,也就是主窗口。以下代码可以清楚地说明这一过程:
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')
# 运行程序以保持窗口处于活动状态
root.mainloop()
pack()函数用于将框架几何地嵌入到窗口中。side='left'参数表示框架应被放置在屏幕的最左侧;默认情况下,框架会位于屏幕的中心。anchor='n'则指示组件应该从框架的顶部开始排列。默认情况下,组件是从框架的中心开始放置的。anchor='n'中的“n”代表“北”方向。
需要注意的是,由于我们在程序早期就定义了frame1,因此它会占据窗口的最左侧位置。尽管frame2也被设置为位于最左侧,但这两个框架并不会重叠。frame2会自动调整自己的位置,使其尽可能地向左移动,而不会与frame1发生重叠。因此,frame1、frame2、frame3和frame4会并排出现在窗口的左侧。
如何向窗口中添加按钮
在Tkinter中,我们可以使用tk.Button()函数来创建按钮组件。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 参数来改变按钮的大小。
其次,我们定义了两个函数:buttons 和 buttons_ops。前者用于创建数字按钮,后者用于创建运算符按钮。这样做的目的是为了让不同类型的按钮在背景颜色、文字颜色等方面呈现出不同的样式。
你可以通过调整 tk.Button() 函数中的 bg 和 fg 参数来改变按钮的颜色。
最后,我们使用这两个函数创建了所有的按钮,并用 pack() 方法将它们排列在相应的位置上。需要注意的是,我们还没有为等号和清除按钮创建对应的代码。
当我们运行这个程序时,会弹出以下窗口:

你可以尝试点击这些按钮,以确保目前一切正常。
如何添加计算器的输出屏幕
对于计算器的输出屏幕,我们将使用Tkinter中的Entry对象。在这种情况下,Entry对象是最合适的选择,因为我们需要一个单行显示区域来呈现用户的输入内容。虽然也可以使用Text对象,但它提供的是多行显示区域。因此,在这里我们只使用Entry对象。
另外,由于我们希望输出屏幕位于键盘的上方,所以需要在嵌入其他框架之前先定义并放置这个对象。
Entry对象是通过tk.Entry()函数创建的。这个函数的参数与tk.Button()函数类似。以下代码创建了一个输入框:
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 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("计算器")
# 创建输入框
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`表示对象中文本的最后一个字符位置。该函数的第二个参数则是需要被插入的文本内容。
最后,我们再次将对象的`state`设置为`readonly`,这样就可以防止除了我们定义的计算器键盘之外的任何外部输入了。
现在让我们来看看`buttons`和`buttons_ops`函数。你可能已经注意到,在`tk.Button()`函数中,我们添加了`command`参数。`lambda`表达式的作用是让程序仅在按钮被点击时才执行相应的命令。
总体来说,`command=lambda: command(text)`这一代码的含义是:当我们点击迄今为止所定义的这些按钮时,就会执行`command()`函数,并在输出屏幕上显示被点击的按钮所对应的字符。
现在试着在你的窗口中点击一些按钮吧。它们应该会像下面这样出现在输出屏幕上:

如何为输出屏幕添加滚动条
现在,你可能会遇到这样一个问题:当你输入大量字符时,只能看到前几个字符,其余的字符都显示不出来。
为了解决这个问题,我们将在输出屏幕上添加一个滚动条。
首先,我们会在`entry`对象之前,通过`tk.Scrollbar()`创建一个滚动条对象。以下代码展示了具体的实现方法:
“`python
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组件的状态设置为normal,然后使用entry.get()函数获取输出屏幕上的文本,并将其中的‘x’替换为‘*’。因为乘法在数学中表示为‘*’,而不是‘x’。
接下来我们会添加一个try-except块。我们会尝试使用Python内置的eval()函数来计算提取出来的数学表达式。如果这个表达式无效,程序不会抛出错误,而是会在屏幕上显示“Invalid”这一提示信息。
import tkinter as tk
# 窗口初始化
root = tk.Tk()
# 为窗口命名
root.title("计算器")
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()函数。这个函数会删除输出屏幕上从第一个参数指定的索引位置开始,直到最后一个参数指定的索引位置结束的所有文本内容(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("计算器")
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 = '无效'
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,并为无效输入添加相应的处理逻辑。)
感谢您的阅读!