图形化计算器

个人网站:“http://taihua.vawav.cn/

第一种写法:

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)  
        self.resultLabel = tk.Label(self, font = ('Helvetica', 20),
                                    width = 16, anchor='e', textvariable=self.result)
        self.resultLabel.grid(row = 1, column = 0, columnspan = 4)
        buttons = [[ 'CE', 'C', '←', '/'],
                   ['7', '8', '9', '×'],
                   ['4', '5', '6', '-'],
                   ['1', '2', '3', '+'],
                   ['太华', '0', '.', '=']]
        for r in range(5):
            for c in range(4):
                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 == '太华':
            newnum = '他真的好帅'
            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()

第二种写法:

#!/usr/bin/python
# -*- coding:utf-8 -*-

import tkinter

root = tkinter.Tk()
root.minsize(280, 500)
root.title('计算器')

result = tkinter.StringVar()
result.set(0)  # 显示面板显示结果1,用于显示默认数字0
result2 = tkinter.StringVar()  # 显示面板显示结果2,用于显示计算过程
result2.set('')

label1 = tkinter.Label(root, bg='#EEE9E9', bd='9', fg='#828282', anchor='se', textvariable=result2)
label1.place(width=280, height=170)
label2 = tkinter.Label(root, bg='#EEE9E9', bd='9', fg='black', anchor='se', textvariable=result)
label2.place(y=170, width=280, height=60)

btn1 = tkinter.Button(root, text='1', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('1'))
btn1.place(x=0, y=395, width=70, height=55)
btn2 = tkinter.Button(root, text='2', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('2'))
btn2.place(x=70, y=395, width=70, height=55)
btn3 = tkinter.Button(root, text='3', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('3'))
btn3.place(x=140, y=395, width=70, height=55)
btn0 = tkinter.Button(root, text='0', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('0'))
btn0.place(x=70, y=450, width=70, height=55)

btn4 = tkinter.Button(root, text='4', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('4'))
btn4.place(x=0, y=340, width=70, height=55)
btn5 = tkinter.Button(root, text='5', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('5'))
btn5.place(x=70, y=340, width=70, height=55)
btn6 = tkinter.Button(root, text='6', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('6'))
btn6.place(x=140, y=340, width=70, height=55)

btn7 = tkinter.Button(root, text='7', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('7'))
btn7.place(x=0, y=285, width=70, height=55)
btn8 = tkinter.Button(root, text='8', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('8'))
btn8.place(x=70, y=285, width=70, height=55)
btn9 = tkinter.Button(root, text='9', fg='#4F4F4F', bd=0.5, command=lambda: pressNum('9'))
btn9.place(x=140, y=285, width=70, height=55)

btnac = tkinter.Button(root, text='AC', fg='purple', bd=0.5, command=lambda: pressCompute('AC'))
btnac.place(x=0, y=230, width=70, height=55)
btnback = tkinter.Button(root, text='←', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('b'))
btnback.place(x=70, y=230, width=70, height=55)
btndivi = tkinter.Button(root, text='➗', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('/'))
btndivi.place(x=140, y=230, width=70, height=55)
btnmul = tkinter.Button(root, text='X', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('*'))
btnmul.place(x=210, y=230, width=70, height=55)
btnsub = tkinter.Button(root, text='➖', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('-'))
btnsub.place(x=210, y=285, width=70, height=55)
btnadd = tkinter.Button(root, text='➕', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('+'))
btnadd.place(x=210, y=340, width=70, height=55)
btnequ = tkinter.Button(root, text='=', bg='orange', fg='#4F4F4F', bd=0.5, command=lambda: pressEqual())
btnequ.place(x=210, y=395, width=70, height=110)
btnper = tkinter.Button(root, text='%', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('%'))
btnper.place(x=0, y=450, width=70, height=55)
btnpoint = tkinter.Button(root, text='.', fg='#4F4F4F', bd=0.5, command=lambda: pressCompute('.'))
btnpoint.place(x=140, y=450, width=70, height=55)

lists = []  # 设置一个变量保存运算数字和符号的列表
isPressSign = False  # 并添加一个判断是否按下运算符号的标志,假设默认没有按下按钮
isPressNum = False


def pressNum(num):  # 并设置一个数字函数判断是否按下数字并获取数字将数字写在显示版上
    global lists  # 全局化 lists和按钮状态 isPressSign
    global isPressSign
    if isPressSign == False:
        pass
    else:  # 重新将运算符号状态没置为否
        result.set(0)
        isPressSign = False
    oldnum = result.get()
    if oldnum == '0':
        result.set(num)
    else:
        newnum = oldnum + num
        result.set(newnum)


def pressCompute(sign):
    global lists
    global isPressSign
    num = result.get()  # 获取界面数字
    lists.append(num)  # 保存界面获取的数字到列表中
    lists.append(sign)  # 将按下的运算符号保存到列表中
    isPressSign = True
    if sign == 'AC':  # 如果按下'AC'按键,则清空列表内容,将屏幕上的数字健设置为默认值O
        lists.clear()
        result.set(0)
    if sign == 'b':  # 如果按下的是退格,则选取当前数字第一位到倒数第二位
        a = num[0:-1]
        lists.clear()
        result.set(a)


def pressEqual():
    global lists
    global isPressSign
    curnum = result.get()  # 获取当前数字保存到变量
    lists.append(curnum)  # 将当前数字添加到列表
    computrStr = ''.join(lists)  # 将列表中的字符串用join命令连接起来
    endNum = eval(computrStr)  # 用eval命令运算字符串中的内容
    result.set(endNum)  # 将运算结果显示到屏慕1
    result2.set(computrStr)  # 将运算过程显示到屏幕2
    lists.clear()  # 清空列表内容


root.mainloop()

具体内容后续会补充,这个实验作业代码先简单放在这里。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值