一、实验目的
学习使用Python的Tkinter库进行图形界面编程,实现一个具有弹窗界面的电子计算器,完成基本的加、减、乘、除运算。
二、实验原理
Tkinter是Python的标准GUI(图形用户界面)库,用于创建窗口、标签、按钮等图形界面元素。通过编写Python代码,使用Tkinter库创建计算器的图形界面,并定义各个按钮的功能。使用事件处理机制,响应用户的输入和按钮点击事件,完成相应的数学运算。
三、实验条件(设备与软件等)
Python环境:Python3.11.2版本
开发工具:PyCharm
四、实验步骤
1.导入Tkinter库,创建主窗口。
2.定义计算器的各种按钮,并设置其位置和字体。
3.使用事件处理函数,定义每个按钮的功能。
4.运行主循环,显示计算器的图形界面,等待用户操作。
五、实验结果
成功实现了一个具有图形界面的电子计算器,能够完成基本的加、减、乘、除运算。计算器界面美观,按钮布局合理,操作简便。计算结果准确,程序运行稳定。
六、实验分析
通过本实验,掌握了Tkinter库的基本使用方法,学会了如何创建图形界面程序。学会了使用事件处理机制,实现用户与程序之间的交互。培养了分析和解决问题的能力,提高了编程实践能力。
七、思考与总结
通过本次实验,学会了使用Python的Tkinter库实现一个具有图形界面的电子计算器,掌握了基本的图形界面编程技巧,提高了编程实践能力。在今后的学习中,将继续深入学习Python编程,探索更多实际应用。
八、代码
from tkinter import *
# from tkinter.ttk import *
def frame(master):
"""将共同的属性作为默认值, 以简化Frame创建过程"""
w = Frame(master)
w.pack(side=TOP, expand=YES, fill=BOTH)
return w
def btn(master, text, command):
"""提取共同的属性作为默认值, 使Button创建过程简化"""
w = Button(master, text=text, command=command, width=6)
w.pack(side=LEFT, expand=YES, fill=BOTH, padx=2, pady=2)
return w
def calc(text_data):
"""用eval方法计算表达式字符串"""
try:
if (separator_flag.get() == 0):
return eval(del_separator(text_data))
else:
return add_separator(str(eval(del_separator(text_data))))
except (SyntaxError, ZeroDivisionError, NameError):
return 'Error'
def back(text_data):
"""将text_data最末的字符删除并返回"""
if len(text_data) > 0:
return text_data[:-1]
else:
return text_data
def add_separator(text_data):
"""向参数传入的数字串中添加千位分隔符
这里考虑了三种情况: 无整数部份, 无小数部份, 同时有整数和小数部份
由于字符串是不可改变的, 这里由字符串生成列表以便执行insert操作和
extend操作, 操作完成后最由列表生成字符串返回
"""
dot_index = text_data.find('.')
if dot_index > 0:
text_head = text[:dot_index]
text_tail = text[dot_index:]
elif dot_index < 0:
text_head = text_data
text_tail = ''
else:
text_head = ''
text_tail = text_data
list_ = [char for char in text_head]
length = len(list_)
tmp_index = 3
while length - tmp_index > 0:
list_.insert(length - tmp_index, ',')
tmp_index += 3
list_.extend(text_tail)
new_text = ''
for char in list_:
new_text += char
return new_text
def del_separator(text_data):
"""删除数字串中所有的千位分隔符"""
return text_data.replace(',', '')
# 开始界面的实现
init_root = Tk()
init_root.resizable(width=False, height=False)
init_root.title("计算器") # 添加标题
main_menus = Menu() # 创建最上层主菜单
# 创建计算器菜单, 并加入到主菜单
calc_menu = Menu(main_menus, tearoff=0)
calc_menu.add_command(label='退出', command=lambda: exit())
main_menus.add_cascade(label='菜单', menu=calc_menu)
text = StringVar()
separator_flag = IntVar()
separator_flag.set(0)
view_menu = Menu(main_menus, tearoff=0)
init_root['menu'] = main_menus # 将主菜单与root绑定
# 创建文本框
Entry(init_root, textvariable=text).pack(expand=YES, fill=BOTH, padx=2, pady=4)
# style = Style()
# style.configure('TButton', padding=3)
# 创建第一行三个按钮
first_line = frame(init_root)
btn(first_line, '回退', lambda t=text: t.set(back(t.get())))
btn(first_line, '清空', lambda t=text: t.set(''))
# 每行四个, 创建其余四行按钮
for key in ('789/', '456*', '123-', '0.=+'):
others = frame(init_root)
for char in key:
if char == '=':
btn(others, char,
lambda data=text: data.set(calc(data.get())))
else:
btn(others, char,
lambda data=text, c=char: data.set(data.get() + c))
if __name__ == '__main__':
init_root.mainloop()
九、预期结果