python使用tkinter实现一个高颜值计算器

本文将使用python自带的图形开发包tkinter编写一个带界面的计算器程序,可以进行简单的加减乘除,非常适合入门。

效果预览

废话不多说,先看效果。
在这里插入图片描述

是不是很棒,颜值个人感觉还是很高的。好,接下来,让我们一步步来完成这个计算器的开发。

我们默认你已经安装pycharm,且配置好基于python3.x的开发环境(如果还未配置,请参考我之前的教程)。

好,万事具备,只欠东风,让我们打开编辑器,愉快的敲起来吧

开发过程

首先要导入我们用到的包,tkinter以及相应的字体包

import tkinter
import tkinter.font

接着我们来定义一个对象,并初始化一些会用到的变量

class Calculator(object):
    def __init__(self):
        self.root = tkinter.Tk()
        self.all_press_lists = []  # 保存运算数字和符号的列表
        self.is_press_compute = False  # 判断是否按下运算按钮,默认没有按下
        self.result = tkinter.StringVar()  # 显示输入的数字及结果
        self.record = tkinter.StringVar()  # 显示计算过程

好了,接下来是我们用到的判断系统,判断是数字键还是运算键被按下,并进行记录

    # 按下数字
def press_num(self, num):
    if self.is_press_compute is True:  # 如果判断运算按键被按下
        self.result.set(0)  # 清空self.result
        self.is_press_compute = False
    # 判断界面的数字是否为0
    old_num = self.result.get()
    if old_num == '0':
        self.result.set(num)
    else:
        new_num = old_num + num
        self.result.set(new_num)

# 按下运算符
def press_compute(self, sign):
    num = self.result.get()
    self.all_press_lists.append(num)
    self.all_press_lists.append(sign)
    self.is_press_compute = True

    if sign == 'AC':  # 按下'C',清空列表内容,显示0
        self.all_press_lists.clear()
        self.result.set(0)
    if sign == 'b':  # 按下退格,当前数字逐步减一
        a = num[0:-1]
        self.all_press_lists.clear()
        self.result.set(a)

# 获取运算结果
def press_equal(self):
    cur_num = self.result.get()
    self.all_press_lists.append(cur_num)
    compute_str = ''.join(self.all_press_lists)
    try:
        calculate_result = eval(compute_str)
    except:
        calculate_result = 'bad parameter'
    self.result.set(calculate_result)  # 显示结果
    self.record.set(compute_str + "=")  # 显示运算过程
    self.all_press_lists.clear()  # 清空列表内容

最后,是我们的界面搭建部分

def main(self):
    self.root.minsize(300, 550)  # 显示框的最小长宽
    self.root.title('计算器')  # 标题
    self.root.iconbitmap("icon.ico")  # 左上角图标

    input_bg, num_fg, btn_fg, btn_bg = "#393943", "#DCDCDC", "#909194", "#22222C"  # 各种颜色
    btn_w, btn_h = 75, 70  # 按钮的长宽

    my_font = tkinter.font.Font(family='微软雅黑', size=20)  # 设置字体
    self.result.set(0)
    self.record.set('')
    # 显示版
    label = tkinter.Label(self.root, font=my_font, bg=input_bg, bd='9', fg=num_fg, anchor='se',
                          textvariable=self.record)
    label.place(width=300, height=120)
    label2 = tkinter.Label(self.root, font=my_font, bg=input_bg, bd='9', fg=num_fg, anchor='se',
                           textvariable=self.result)
    label2.place(y=120, width=300, height=80)

    # 第一行
    btn_ac = tkinter.Button(self.root, text='c', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                            command=lambda: self.press_compute('AC'))
    btn_ac.place(x=btn_w * 0, y=200 + btn_h * 0, width=btn_w, height=btn_h)
    btn_back = tkinter.Button(self.root, text='←', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                              command=lambda: self.press_compute('b'))
    btn_back.place(x=btn_w * 1, y=200 + btn_h * 0, width=btn_w, height=btn_h)
    btn_per = tkinter.Button(self.root, text='%', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                             command=lambda: self.press_compute('%'))
    btn_per.place(x=btn_w * 2, y=200 + btn_h * 0, width=btn_w, height=btn_h)
    btn_divi = tkinter.Button(self.root, text='÷', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                              command=lambda: self.press_compute('/'))
    btn_divi.place(x=btn_w * 3, y=200 + btn_h * 0, width=btn_w, height=btn_h)

    # 第二行
    btn7 = tkinter.Button(self.root, text='7', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('7'))
    btn7.place(x=btn_w * 0, y=200 + btn_h * 1, width=btn_w, height=btn_h)
    btn8 = tkinter.Button(self.root, text='8', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('8'))
    btn8.place(x=btn_w * 1, y=200 + btn_h * 1, width=btn_w, height=btn_h)
    btn9 = tkinter.Button(self.root, text='9', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('9'))
    btn9.place(x=btn_w * 2, y=200 + btn_h * 1, width=btn_w, height=btn_h)
    btn_mul = tkinter.Button(self.root, text='×', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                             command=lambda: self.press_compute('*'))
    btn_mul.place(x=btn_w * 3, y=200 + btn_h * 1, width=btn_w, height=btn_h)

    # 第三行
    btn4 = tkinter.Button(self.root, text='4', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('4'))
    btn4.place(x=btn_w * 0, y=200 + btn_h * 2, width=btn_w, height=btn_h)
    btn5 = tkinter.Button(self.root, text='5', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('5'))
    btn5.place(x=btn_w * 1, y=200 + btn_h * 2, width=btn_w, height=btn_h)
    btn6 = tkinter.Button(self.root, text='6', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('6'))
    btn6.place(x=btn_w * 2, y=200 + btn_h * 2, width=btn_w, height=btn_h)
    btn_sub = tkinter.Button(self.root, text='-', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                             command=lambda: self.press_compute('-'))
    btn_sub.place(x=btn_w * 3, y=200 + btn_h * 2, width=btn_w, height=btn_h)

    # 第四行
    btn1 = tkinter.Button(self.root, text='1', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('1'))
    btn1.place(x=btn_w * 0, y=200 + btn_h * 3, width=btn_w, height=btn_h)
    btn2 = tkinter.Button(self.root, text='2', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('2'))
    btn2.place(x=btn_w * 1, y=200 + btn_h * 3, width=btn_w, height=btn_h)
    btn3 = tkinter.Button(self.root, text='3', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('3'))
    btn3.place(x=btn_w * 2, y=200 + btn_h * 3, width=btn_w, height=btn_h)
    btn_add = tkinter.Button(self.root, text='+', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                             command=lambda: self.press_compute('+'))
    btn_add.place(x=btn_w * 3, y=200 + btn_h * 3, width=btn_w, height=btn_h)

    # 第五行
    btn0 = tkinter.Button(self.root, text='0', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                          command=lambda: self.press_num('0'))
    btn0.place(x=btn_w * 0, y=200 + btn_h * 4, width=btn_w * 2, height=btn_h)
    btn_point = tkinter.Button(self.root, text='.', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                               command=lambda: self.press_num('.'))
    btn_point.place(x=btn_w * 2, y=200 + btn_h * 4, width=btn_w, height=btn_h)
    btn_equ = tkinter.Button(self.root, text='=', bg='#982425', font=my_font, fg=num_fg, bd=0,
                             command=lambda: self.press_equal())
    btn_equ.place(x=btn_w * 3, y=200 + btn_h * 4, width=btn_w, height=btn_h)
    self.root.mainloop()

到此我们的计算器就已经开发完成了,很多地方其实都还不完善,小伙伴们可以根据自己的需求再添加一些相应的功能,最后附上完整代码。

import tkinter
import tkinter.font


class Calculator(object):
    def __init__(self):
        self.root = tkinter.Tk()
        self.all_press_lists = []  # 保存运算数字和符号的列表
        self.is_press_compute = False  # 判断是否按下运算按钮,默认没有按下
        self.result = tkinter.StringVar()  # 显示输入的数字及结果
        self.record = tkinter.StringVar()  # 显示计算过程

    def main(self):
        self.root.minsize(300, 550)  # 显示框的最小长宽
        self.root.title('计算器')  # 标题
        self.root.iconbitmap("icon.ico")  # 左上角图标

        input_bg, num_fg, btn_fg, btn_bg = "#393943", "#DCDCDC", "#909194", "#22222C"  # 各种颜色
        btn_w, btn_h = 75, 70  # 按钮的长宽

        my_font = tkinter.font.Font(family='微软雅黑', size=20)  # 设置字体
        self.result.set(0)
        self.record.set('')
        # 显示版
        label = tkinter.Label(self.root, font=my_font, bg=input_bg, bd='9', fg=num_fg, anchor='se',
                              textvariable=self.record)
        label.place(width=300, height=120)
        label2 = tkinter.Label(self.root, font=my_font, bg=input_bg, bd='9', fg=num_fg, anchor='se',
                               textvariable=self.result)
        label2.place(y=120, width=300, height=80)

        # 第一行
        btn_ac = tkinter.Button(self.root, text='c', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                command=lambda: self.press_compute('AC'))
        btn_ac.place(x=btn_w * 0, y=200 + btn_h * 0, width=btn_w, height=btn_h)
        btn_back = tkinter.Button(self.root, text='←', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                  command=lambda: self.press_compute('b'))
        btn_back.place(x=btn_w * 1, y=200 + btn_h * 0, width=btn_w, height=btn_h)
        btn_per = tkinter.Button(self.root, text='%', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                 command=lambda: self.press_compute('%'))
        btn_per.place(x=btn_w * 2, y=200 + btn_h * 0, width=btn_w, height=btn_h)
        btn_divi = tkinter.Button(self.root, text='÷', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                  command=lambda: self.press_compute('/'))
        btn_divi.place(x=btn_w * 3, y=200 + btn_h * 0, width=btn_w, height=btn_h)

        # 第二行
        btn7 = tkinter.Button(self.root, text='7', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('7'))
        btn7.place(x=btn_w * 0, y=200 + btn_h * 1, width=btn_w, height=btn_h)
        btn8 = tkinter.Button(self.root, text='8', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('8'))
        btn8.place(x=btn_w * 1, y=200 + btn_h * 1, width=btn_w, height=btn_h)
        btn9 = tkinter.Button(self.root, text='9', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('9'))
        btn9.place(x=btn_w * 2, y=200 + btn_h * 1, width=btn_w, height=btn_h)
        btn_mul = tkinter.Button(self.root, text='×', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                 command=lambda: self.press_compute('*'))
        btn_mul.place(x=btn_w * 3, y=200 + btn_h * 1, width=btn_w, height=btn_h)

        # 第三行
        btn4 = tkinter.Button(self.root, text='4', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('4'))
        btn4.place(x=btn_w * 0, y=200 + btn_h * 2, width=btn_w, height=btn_h)
        btn5 = tkinter.Button(self.root, text='5', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('5'))
        btn5.place(x=btn_w * 1, y=200 + btn_h * 2, width=btn_w, height=btn_h)
        btn6 = tkinter.Button(self.root, text='6', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('6'))
        btn6.place(x=btn_w * 2, y=200 + btn_h * 2, width=btn_w, height=btn_h)
        btn_sub = tkinter.Button(self.root, text='-', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                 command=lambda: self.press_compute('-'))
        btn_sub.place(x=btn_w * 3, y=200 + btn_h * 2, width=btn_w, height=btn_h)

        # 第四行
        btn1 = tkinter.Button(self.root, text='1', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('1'))
        btn1.place(x=btn_w * 0, y=200 + btn_h * 3, width=btn_w, height=btn_h)
        btn2 = tkinter.Button(self.root, text='2', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('2'))
        btn2.place(x=btn_w * 1, y=200 + btn_h * 3, width=btn_w, height=btn_h)
        btn3 = tkinter.Button(self.root, text='3', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('3'))
        btn3.place(x=btn_w * 2, y=200 + btn_h * 3, width=btn_w, height=btn_h)
        btn_add = tkinter.Button(self.root, text='+', font=my_font, bg=btn_bg, fg=btn_fg, bd=0,
                                 command=lambda: self.press_compute('+'))
        btn_add.place(x=btn_w * 3, y=200 + btn_h * 3, width=btn_w, height=btn_h)

        # 第五行
        btn0 = tkinter.Button(self.root, text='0', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                              command=lambda: self.press_num('0'))
        btn0.place(x=btn_w * 0, y=200 + btn_h * 4, width=btn_w * 2, height=btn_h)
        btn_point = tkinter.Button(self.root, text='.', font=my_font, bg=btn_bg, fg=num_fg, bd=0,
                                   command=lambda: self.press_num('.'))
        btn_point.place(x=btn_w * 2, y=200 + btn_h * 4, width=btn_w, height=btn_h)
        btn_equ = tkinter.Button(self.root, text='=', bg='#982425', font=my_font, fg=num_fg, bd=0,
                                 command=lambda: self.press_equal())
        btn_equ.place(x=btn_w * 3, y=200 + btn_h * 4, width=btn_w, height=btn_h)
        self.root.mainloop()

    # 按下数字
    def press_num(self, num):
        if self.is_press_compute is True:  # 如果判断运算按键被按下
            self.result.set(0)  # 清空self.result
            self.is_press_compute = False
        # 判断界面的数字是否为0
        old_num = self.result.get()
        if old_num == '0':
            self.result.set(num)
        else:
            new_num = old_num + num
            self.result.set(new_num)

    # 按下运算符
    def press_compute(self, sign):
        num = self.result.get()
        self.all_press_lists.append(num)
        self.all_press_lists.append(sign)
        self.is_press_compute = True

        if sign == 'AC':  # 按下'C',清空列表内容,显示0
            self.all_press_lists.clear()
            self.result.set(0)
        if sign == 'b':  # 按下退格,当前数字逐步减一
            a = num[0:-1]
            self.all_press_lists.clear()
            self.result.set(a)

    # 获取运算结果
    def press_equal(self):
        cur_num = self.result.get()
        self.all_press_lists.append(cur_num)
        compute_str = ''.join(self.all_press_lists)
        try:
            calculate_result = eval(compute_str)
        except:
            calculate_result = 'bad parameter'
        self.result.set(calculate_result)  # 显示结果
        self.record.set(compute_str + "=")  # 显示运算过程
        self.all_press_lists.clear()  # 清空列表内容


if __name__ == '__main__':
    my_calculator = Calculator()
    my_calculator.main()

ps:如果觉得文章对您有所帮助,欢迎点赞收藏转发,感谢呦!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值