利用Tkinter图形库开发简单的计算器

目录

1.具备以下功能:

2.程序代码

3.运行截图


1.具备以下功能:

(1) 利用数字Button按钮和运算符实现向Entry组件文本框输入数据和运算符;

(2) 能够利用Entry组件获取用户输入的公式,利用eval()函数对公式进行计算;

(3) 点击“计算”按钮,在文本框中显示计算结果(如图)。点击“清屏”按钮则清除文本框中的内容。

2.程序代码

import tkinter as tk
import tkinter.font as font

class View:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title('计算器')
        # 大小 ,窗口移动到 距屏幕左侧350,上侧150 的位置
        self.window.geometry('599x500+350+150')
        # 按钮宽度,统一设置,便于修改
        self.btn_width = 5
        # 按钮字体大小
        self.btn_font = font.Font(size=20)
        # frame 便于布局
        self.frame = tk.Frame(self.window)
        self.display = tk.Frame(self.frame)
        self.buttons = tk.Frame(self.frame)
        # 显示区域
        self.show_exp = tk.Label(self.display, font=self.btn_font,
                                 background='#FCFCFC', width=42, height=2)
        self.show = tk.Label(self.display, font=self.btn_font,
                             background='#FCFCFC', width=42, height=2)
        # 按钮 0-9
        self.btn_zero = tk.Button(self.buttons, text='0',
                                  font=self.btn_font, width=self.btn_width, bg='green')
        self.btn_one = tk.Button(self.buttons, text='1',
                                 font=self.btn_font, width=self.btn_width, bg="orange")
        self.btn_two = tk.Button(self.buttons, text='2',
                                 font=self.btn_font, width=self.btn_width, bg="blue")
        self.btn_three = tk.Button(self.buttons, text='3',
                                   font=self.btn_font, width=self.btn_width, bg="pink")
        self.btn_four = tk.Button(self.buttons, text='4',
                                  font=self.btn_font, width=self.btn_width, bg="purple")
        self.btn_five = tk.Button(self.buttons, text='5',
                                  font=self.btn_font, width=self.btn_width, bg="yellow")
        self.btn_six = tk.Button(self.buttons, text='6',
                                 font=self.btn_font, width=self.btn_width, bg="cyan")
        self.btn_seven = tk.Button(self.buttons, text='7',
                                   font=self.btn_font, width=self.btn_width, bg="red")
        self.btn_eight = tk.Button(self.buttons, text='8',
                                   font=self.btn_font, width=self.btn_width, bg="grey")
        self.btn_nine = tk.Button(self.buttons, text='9',
                                  font=self.btn_font, width=self.btn_width, bg="white")
        # 按钮 运算符号
        self.btn_dot = tk.Button(self.buttons, text='.',
                                 font=self.btn_font, width=self.btn_width)
        self.btn_add = tk.Button(self.buttons, text='+',
                                 font=self.btn_font, width=self.btn_width)
        self.btn_subtract = tk.Button(self.buttons, text='-',
                                      font=self.btn_font, width=self.btn_width)
        self.btn_multiply = tk.Button(self.buttons, text='*',
                                      font=self.btn_font, width=self.btn_width)
        self.btn_round = tk.Button(self.buttons, text='//',
                                   font=self.btn_font, width=self.btn_width)

        self.btn_divide = tk.Button(self.buttons, text='/',
                                    font=self.btn_font, width=self.btn_width)

        self.btn_module = tk.Button(self.buttons, text='%',
                                    font=self.btn_font, width=self.btn_width)

        self.btn_equal = tk.Button(self.buttons, text='计算',
                                   font=self.btn_font, width=self.btn_width)
        self.btn_negate = tk.Button(self.buttons, text='+/-',
                                    font=self.btn_font, width=self.btn_width)
        self.btn_power = tk.Button(self.buttons, text='**',
                                   font=self.btn_font, width=self.btn_width)

        self.btn_left = tk.Button(self.buttons, text='(',
                                  font=self.btn_font, width=self.btn_width)
        self.btn_right = tk.Button(self.buttons, text=')',
                                   font=self.btn_font, width=self.btn_width)
        self.btn_clear = tk.Button(self.buttons, text='清屏',
                                   font=self.btn_font, width=self.btn_width)

    def set_ui(self):
        # 放置 frame
        self.frame.grid(row=0, column=0)
        self.display.grid(row=0, column=0)
        self.buttons.grid(row=1, column=0)
        # 放置显示区域
        self.show_exp.grid(row=0, column=0)
        self.show.grid(row=1, column=0)
        # 放置0、1、2、3、4
        self.btn_zero.grid(row=0, column=0)
        self.btn_one.grid(row=0, column=1)
        self.btn_two.grid(row=0, column=2)
        self.btn_three.grid(row=0, column=3)
        self.btn_four.grid(row=0, column=4)

        # 放置5、6、7、8、9
        self.btn_five.grid(row=1, column=0)
        self.btn_six.grid(row=1, column=1)
        self.btn_seven.grid(row=1, column=2)
        self.btn_eight.grid(row=1, column=3)
        self.btn_nine.grid(row=1, column=4)

        # 放置 .
        self.btn_dot.grid(row=2, column=2)

        # 放置+、-、*
        self.btn_add.grid(row=3, column=1)
        self.btn_subtract.grid(row=3, column=2)
        self.btn_multiply.grid(row=3, column=3)

        # 放置//、/、%
        self.btn_round.grid(row=4, column=1)
        self.btn_divide.grid(row=4, column=2)
        self.btn_module.grid(row=4, column=3)
        # 放置 **、(、)
        self.btn_power.grid(row=5, column=1)
        self.btn_left.grid(row=5, column=2)
        self.btn_right.grid(row=5, column=3)

        # 放置 清屏、计算
        self.btn_clear.grid(row=6, column=1)
        self.btn_equal.grid(row=6, column=3)
# 是否点击 等于 按钮
flag = False
class Main:
    def __init__(self):
        self.view = View()
        self.view.set_ui()
        self.connect()

    # 绑定函数
    def connect(self):
        self.view.btn_zero.bind('<Button-1>', lambda e: self.input('0'))
        self.view.btn_one.bind('<Button-1>', lambda e: self.input('1'))
        self.view.btn_two.bind('<Button-1>', lambda e: self.input('2'))
        self.view.btn_three.bind('<Button-1>', lambda e: self.input('3'))
        self.view.btn_four.bind('<Button-1>', lambda e: self.input('4'))
        self.view.btn_five.bind('<Button-1>', lambda e: self.input('5'))
        self.view.btn_six.bind('<Button-1>', lambda e: self.input('6'))
        self.view.btn_seven.bind('<Button-1>', lambda e: self.input('7'))
        self.view.btn_eight.bind('<Button-1>', lambda e: self.input('8'))
        self.view.btn_nine.bind('<Button-1>', lambda e: self.input('9'))
        self.view.btn_add.bind('<Button-1>', lambda e: self.input('+'))
        self.view.btn_subtract.bind('<Button-1>', lambda e: self.input('-'))
        self.view.btn_multiply.bind('<Button-1>', lambda e: self.input('*'))
        self.view.btn_divide.bind('<Button-1>', lambda e: self.input('/'))
        self.view.btn_left.bind('<Button-1>', lambda e: self.input('('))
        self.view.btn_right.bind('<Button-1>', lambda e: self.input(')'))
        self.view.btn_dot.bind('<Button-1>', lambda e: self.input('.'))
        self.view.btn_negate.bind('<Button-1>', lambda e: self.input('--'))
        self.view.btn_clear.bind('<Button-1>', self.clear)
        self.view.btn_power.bind('<Button-1>', lambda e: self.input('**'))
        self.view.btn_module.bind('<Button-1>', lambda e: self.input('%'))
        self.view.btn_round.bind('<Button-1>', lambda e: self.input('//'))
        self.view.btn_equal.bind('<Button-1>', lambda e: self.view.show.configure(
            text=self.calculate(self.view.show_exp.cget('text'))
        ))

    # 计算表达式
    def calculate(self, expression):
        self.view.show_exp.configure(text=expression + '=')
        try:
            result = eval(expression)
            global flag
            flag = True
            return str(result)
        except (SyntaxError, NameError):
            flag = True
            return '错误'

    # 显示、处理输入(按钮点击)
    def input(self, value):
        # 刚刚计算完,清空原有数据
        global flag
        if flag:
            self.clear('')
            flag = False
        operate = ['+', '-', '*', '/', '//', '%', '**']
        text = self.view.show_exp.cget('text')
        # 运算符更改  最后一个是运算符且输入的也是运算符,则更改运算符
        try:
            if text[-1] in operate and value in operate:
                text = text[:-1]
        except IndexError:
            pass
        # 更新数据显示
        val = text + value
        self.view.show_exp.configure(text=val)

    # 清除
    def clear(self, event):
        self.view.show_exp.configure(text='')
        self.view.show.configure(text='')

    def start(self):
        self.view.window.mainloop()
if __name__ == '__main__':
    main = Main()
  

3.运行截图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值