Python Tkinter实现简易图形用户界面计算器
本文详细介绍使用Python Tkinter库开发简易图形用户界面计算器的完整过程。从界面布局设计、组件创建到核心事件处理逻辑,逐步解析如何通过继承Frame类构建计算器。内容涵盖表达式显示、数值输入、运算符处理及结果计算等关键功能,并提供完整代码示例供参考学习。
本文分享了一个使用Python实现的图形用户界面计算器实例,旨在为读者提供具体的代码参考。

计算器界面设计与功能规划
简易图形用户界面计算器的设计思路如下:
该计算器的界面布局与功能规划如下:
(1)界面分为三大部分:第一行用于显示输入的运算表达式;第二行用于显示当前输入的操作数或最终运算结果;第三行至第七行排列计算器的功能按钮。 (2)操作数输入:当用户按下数字0到9及小数点按钮时,界面将显示当前输入的操作数。 (3)操作数编辑功能:按下“-”按钮可删除当前输入操作数的最后一个字符;按下“±”按钮可切换当前输入数值的正负号;按下“C”按钮则完全清除当前输入的操作数。 (4)运算符输入:当用户按下“/”、“*”、“+”等运算符按钮时,界面将显示截至目前已输入的完整运算表达式。 (5)执行运算:当用户按下“=”按钮时,程序将执行相应的运算逻辑,并在第二行显示最终的运算结果。
程序实现逻辑与关键技术
程序实现的核心逻辑与关键技术方法如下:
(1)创建一个继承自Frame类的Calc类,用于封装计算器的整体功能。
(2)在Calc类的构造函数中,实例化并布局计算器所需的各个UI组件。
(2-1)在构造函数内部,创建两个Label对象:exprLabel用于显示运算表达式,resultLabel用于显示当前输入的操作数或运算结果。同时创建两个StringVar实例对象expr和result,并将它们分别绑定到对应的Label对象上。利用grid布局管理器,将这两个Label对象放置在界面的第一行和第二行。 (2-2)在构造函数中,使用一个二维列表存储所有按钮的标签文本。通过嵌套循环的方式创建并布局各个按钮。在循环内部定义事件处理函数cmd(),该函数接受一个默认参数,即按钮标签buttons[r][c],并调用实例方法click(key),从而使得一个函数能够处理所有按钮的点击事件。
(3)事件处理逻辑:在事件处理函数click(self, key)中,根据key的值执行不同的业务逻辑。在构造函数中初始化一个变量startOfNextOperand(默认值为True),用于标识是否开始输入一个新的操作数。当startOfNextOperand为True时,若用户按下数字键,则将当前输入重置为0,以便开始输入新的操作数;当startOfNextOperand为False时,程序将继续在当前操作数后追加新的数字字符。
(3-1)当按下数字键或小数点键时,将输入的字符追加连接到当前操作数的末尾。 (3-2)当按下“C”按钮时,清除当前输入操作数的最后一个字符。 (3-3)当按下“±”按钮时,切换当前输入数值的正负号。 (3-4)当按下“C”按钮时,清除当前输入的全部操作数。 (3-5)当按下运算符“/”、“*”、“+”按钮时,界面显示截至目前已输入的运算表达式。 (3-5)当按下“=”按钮时,程序调用eval函数执行运算逻辑,并显示最终的运算结果。
(4)在“if __name__ == '__main__'”语句块中编写测试代码,实例化Calc对象,并启动主事件循环以显示运行结果。
核心代码实现
import tkinter as tk
class Calculate(tk.Frame):
def __init__(self, parent):
"""简易计算器的构造函数"""
tk.Frame.__init__(self, parent)
self.pack()
self.startOfNextOperand = True # 开始输入下一个操作数
# 创建计算过程和结果的标签
self.expr = tk.StringVar() #显示运算表达式
self.expr.set('')
self.exprLabel = tk.Label(self, font = ('Helvetica', 10),
fg = '#828282', width = 32, anchor='e', textvariable = self.expr)
self.exprLabel.grid(row = 0, column = 0, columnspan = 4)
self.result = tk.StringVar() # 显示结果
self.result.set(0) #结果初始为0
self.resultLabel = tk.Label(self, font = ('Helvetica', 20),
width = 16, anchor='e', textvariable=self.result)
self.resultLabel.grid(row = 1, column = 0, columnspan = 4)
# 计算器按钮的标签,使用2D列表表示
buttons = [[ 'CE', 'C', '←', '/'],
['7', '8', '9', '×'],
['4', '5', '6', '-'],
['1', '2', '3', '+'],
['±', '0', '.', '=']]
# 然后使用嵌套的循环的方法创建和布局行各个按钮
for r in range(5):
for c in range(4):
# 定义事件处理函数cmd(),默认参数为按钮标签buttons[r][c]
def cmd(key = buttons[r][c]):
self.click(key)
b = tk.Button(self, text = buttons[r][c], width=8,command = cmd)
b.grid(row = r+2, column = c)#前两行显示结果 按钮从第三行开始
def click(self, key):
"""事件处理函数"""
if key == '=': #按等号键时, 求值, 并显示结果
result = eval(self.expr.get() + self.result.get())
self.result.set(result)
self.expr.set('')
self.startOfNextOperand = True
elif key in '+-/×':
if key == '×': key = '*'
resultExpr = self.expr.get() + self.result.get() + key
self.expr.set(resultExpr)
self.result.set(0)
self.startOfNextOperand = True
elif key == 'C': # 全部清空, 回到初始状态
self.expr.set('')
self.result.set(0)
elif key == 'CE': # 清空当前输入
self.result.set(0)
elif key == '←':
oldnum = self.result.get()
if len(oldnum) == 1: # 只有一个字符
newnum = 0
else:
newnum = oldnum[:-1]
self.result.set(newnum)
elif key == '±': # 正负号,切换正负号
oldnum = self.result.get() # 获取原来的值
if oldnum[0] == '-':
newnum = oldnum[1:]
else:
newnum = '-' + oldnum
self.result.set(newnum)
else: # 按数字或者小数点键
if self.startOfNextOperand:
self.result.set(0)
self.startOfNextOperand = False
oldnum = self.result.get() # 获取原来的值
if oldnum == '0':
self.result.set(key)
else:
newnum = oldnum + key
self.result.set(newnum)
if __name__ == '__main__':
root = tk.Tk()
root.title('简易计算器')
calculate = Calculate(root)
root.mainloop()以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













