Python Tkinter实现简易图形用户界面计算器

Hazel
Hazel
发布时间:2026-10-15 | 4人浏览过
原创

本文详细介绍使用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()

以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表