目录
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.运行截图