python——制作计算器

效果如图:

 

主要思路:

  • 用列表保存按下的键,按下等于,转换为字符串,利用内置函数eval计算字符串的值。

代码:

from tkinter import *

W = 280 #窗口宽度
H = 460 #窗口高度
process_H = 110 #显示运算过程的标签高度
result_H = 50   #显示运算结果的标签高度
msFont = '微软雅黑' #字体
fontSize = 20 #字体大小

btnBoderWidth = 0.5 #边框宽度
btnColor = '#4F4F4F' #按钮颜色
btnWidth = 70 #按钮宽度
btnHeight = 60 #按钮高度

mainWindows = Tk()
mainWindows.title('计算器')
mainWindows.minsize(W,H)

str_process = StringVar()
str_process.set("")
str_result = StringVar()
str_result.set("0")

process = Label(mainWindows,font=(msFont,fontSize),bg='orange',anchor='se',wraplength='280',textvariable=str_process)
process.place(width=W,height=process_H) #显示运算过程的标签
result = Label(mainWindows,font=(msFont,fontSize+10),bg='orange',anchor='se',textvariable=str_result)
result.place(y=process_H,width=W,height=result_H) #显示运算结果的标签

button_AC = Button(mainWindows,font=(msFont,fontSize),text='AC',fg='orange',bd=btnBoderWidth,command=lambda :clickAC())
button_AC.place(x=0,y=process_H+result_H,width=btnWidth,height=btnHeight)
button_back = Button(mainWindows,font=(msFont,fontSize),text='←',fg=btnColor,bd=btnBoderWidth,command=lambda :clickBack())
button_back.place(x=btnWidth,y=process_H+result_H,width=btnWidth,height=btnHeight)
button_div = Button(mainWindows,font=(msFont,fontSize),text='÷',fg=btnColor,bd=btnBoderWidth,command=lambda :clickOper('/'))
button_div.place(x=btnWidth*2,y=process_H+result_H,width=btnWidth,height=btnHeight)
button_mul = Button(mainWindows,font=(msFont,fontSize),text='×',fg=btnColor,bd=btnBoderWidth,command=lambda :clickOper('*'))
button_mul.place(x=btnWidth*3,y=process_H+result_H,width=btnWidth,height=btnHeight)

button_7 = Button(mainWindows,font=(msFont,fontSize),text='7',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('7'))
button_7.place(x=0,y=process_H+result_H+btnHeight,width=btnWidth,height=btnHeight)
button_8 = Button(mainWindows,font=(msFont,fontSize),text='8',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('8'))
button_8.place(x=btnWidth,y=process_H+result_H+btnHeight,width=btnWidth,height=btnHeight)
button_9 = Button(mainWindows,font=(msFont,fontSize),text='9',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('9'))
button_9.place(x=btnWidth*2,y=process_H+result_H+btnHeight,width=btnWidth,height=btnHeight)
button_minus = Button(mainWindows,font=(msFont,fontSize),text='-',fg=btnColor,bd=btnBoderWidth,command=lambda :clickOper('-'))
button_minus.place(x=btnWidth*3,y=process_H+result_H+btnHeight,width=btnWidth,height=btnHeight)

button_4 = Button(mainWindows,font=(msFont,fontSize),text='4',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('4'))
button_4.place(x=0,y=process_H+result_H+btnHeight*2,width=btnWidth,height=btnHeight)
button_5 = Button(mainWindows,font=(msFont,fontSize),text='5',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('5'))
button_5.place(x=btnWidth,y=process_H+result_H+btnHeight*2,width=btnWidth,height=btnHeight)
button_6 = Button(mainWindows,font=(msFont,fontSize),text='6',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('6'))
button_6.place(x=btnWidth*2,y=process_H+result_H+btnHeight*2,width=btnWidth,height=btnHeight)
button_add = Button(mainWindows,font=(msFont,fontSize),text='+',fg=btnColor,bd=btnBoderWidth,command=lambda :clickOper('+'))
button_add.place(x=btnWidth*3,y=process_H+result_H+btnHeight*2,width=btnWidth,height=btnHeight)

button_1 = Button(mainWindows,font=(msFont,fontSize),text='1',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('1'))
button_1.place(x=0,y=process_H+result_H+btnHeight*3,width=btnWidth,height=btnHeight)
button_2 = Button(mainWindows,font=(msFont,fontSize),text='2',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('2'))
button_2.place(x=btnWidth,y=process_H+result_H+btnHeight*3,width=btnWidth,height=btnHeight)
button_3 = Button(mainWindows,font=(msFont,fontSize),text='3',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('3'))
button_3.place(x=btnWidth*2,y=process_H+result_H+btnHeight*3,width=btnWidth,height=btnHeight)
button_equal = Button(mainWindows,font=(msFont,fontSize),text='=',bg='orange',fg=btnColor,bd=btnBoderWidth,command=lambda :clickEqual())
button_equal.place(x=btnWidth*3,y=process_H+result_H+btnHeight*3,width=btnWidth,height=btnHeight*2)

button_percent = Button(mainWindows,font=(msFont,fontSize),text='%',fg=btnColor,bd=btnBoderWidth,command=lambda :clickOper("%"))
button_percent.place(x=0,y=process_H+result_H+btnHeight*4,width=btnWidth,height=btnHeight)
button_0 = Button(mainWindows,font=(msFont,fontSize),text='0',fg=btnColor,bd=btnBoderWidth,command=lambda :clickNum('0'))
button_0.place(x=btnWidth,y=process_H+result_H+btnHeight*4,width=btnWidth,height=btnHeight)
button_point = Button(mainWindows,font=(msFont,fontSize),text='.',fg=btnColor,bd=btnBoderWidth,command=lambda :clickPoint())
button_point.place(x=btnWidth*2,y=process_H+result_H+btnHeight*4,width=btnWidth,height=btnHeight)

process_list = []
s_result = ""
isNum = [False] #上一位按下的是否是数字
point = [True] #小数点使用情况
def clickNum(num):  #按下数字
    isNum.append(True)
    point.append(point[-1]) #按下数字,小数点的标志不变
    process_list.append(num)
    s_process = "".join(process_list)
    str_process.set(s_process)

def clickOper(sign):#按下运算符
    global isNum,point
    if isNum[-1]:
        process_list.append(sign)
        isNum.append(False)
        point.append(True) #按下运算符,小数点标志为可以按下小数点
    else:
        process_list.pop()
        process_list.append(sign)
    s_process = "".join(process_list)
    str_process.set(s_process)

def clickEqual():#按下等于
    global s_result
    s_process = "".join(process_list)
    s_result = eval(s_process)
    s_result = str(s_result)[0:11] #结果只显示11位
    str_process.set(s_process)
    str_result.set(s_result)

def clickAC():#按下清除
    global s_result,isNum,point
    s_result = "0"
    isNum = [False]  #状态回到初始时候
    point = [True]
    process_list.clear()
    str_result.set(s_result)
    str_process.set("")
def clickBack(): #按下退格键
    global point, isNum
    if len(process_list) > 0:
        isNum.pop(-1) #删除最后一位的状态
        point.pop(-1)
        process_list.pop()
        s_process = "".join(process_list)
        str_process.set(s_process)

def clickPoint():#按下小数点
    global point,isNum
    if isNum[-1] and point[-1]:
        process_list.append(".")
        s_process = "".join(process_list)
        str_process.set(s_process)
        isNum.append(False)
        point.append(False)

mainWindows.mainloop()

 

好的,下面是一个简单的 Python Tkinter 计算器的代码示例: ``` python import tkinter as tk class Calculator: def __init__(self, master): self.master = master master.title("计算器") self.display = tk.Entry(master, width=30, font=('Arial', 16)) self.display.grid(row=0, column=0, columnspan=4, padx=10, pady=10) button_list = [ "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" ] row = 1 col = 0 for button_text in button_list: button = tk.Button(master, text=button_text, width=5, height=2, font=('Arial', 16), command=lambda x=button_text: self.button_click(x)) button.grid(row=row, column=col, padx=5, pady=5) col += 1 if col > 3: col = 0 row += 1 def button_click(self, text): if text == "=": result = eval(self.display.get()) self.display.delete(0, tk.END) self.display.insert(0, result) elif text == "C": self.display.delete(0, tk.END) else: self.display.insert(tk.END, text) root = tk.Tk() app = Calculator(root) root.mainloop() ``` 在这个计算器中,我们使用了 Tkinter 中的 Entry 和 Button 组件。Entry 组件用于显示计算结果,而 Button 组件则用于用户输入数字和运算符。 在构造函数 `__init__` 中,我们首先创建了一个 Entry 组件,并将其放置在第一行第一列,并占据 4 列。接着,我们创建了一个按钮列表,其中包含了计算器的所有功能键。然后,我们使用 for 循环来将这些按钮放置在计算器的界面中。 在 `button_click` 函数中,我们根据用户输入的按钮内容进行相应的处理。如果是 "=" 按钮,则获取 Entry 中的内容并计算结果,然后将结果显示在 Entry 中。如果是 "C" 按钮,则清空 Entry 的内容。否则,将按钮内容添加到 Entry 的末尾。最后,我们创建了一个 Tkinter 窗口,并将其传递给 Calculator 类的实例以启动计算器。 这个计算器还比较简单,但是基本的功能已经实现了。如果你想要添加其他功能,可以在按钮列表中添加相应的按钮,并在 `button_click` 函数中进行处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值