Day1
实验要求:
- 能通过设计的按钮控件输入并实现简单算术运算,要求
表达式在编辑框中显示,能将运算结果,输出在编辑框
内显示; - 能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确
- 并保存历史的表达式运算记录。
- 前期准备:图形界面的开发,例如Microsoft Visual Studio.
- PS:MFC编程时用静态编译,这样编译出来的EXE文件可以独立于环境运行。
相关难点:
1.中缀表达式转换成后缀表达式:
相关链接:中缀表达式转换为后缀表达式相关知识点
2.图形界面的实现。
Day2
项目实现:
因为对c语言以及java的掌握程度一般,加上考虑到时间等因素,这次的计算器设计与实现项目我打算是基于python来实现。
python不仅是一种面向对象的、解释型的、通用的脚本编程语言,而且还是是一种简洁,容易阅读的语言。
用python写的话代码更短更简洁,他只需要调一个包再通过函数来调用即可。
Day3
用python来写这个程序的时候,我用了tkinter包,这是一个python图形开发界面的库,Tkinter 模块(Tk接口)是Python的标准Tk GUI I具包的接口.Tk 和Tkinter可以在大多数的Unix平台下使用,同样可以应用在
Windows和Macintosh系统里。Tk8 0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
相关知识:
-
Tkinter中mainloop函数实质:
简单点来讲,mainloop的定义是:当主窗口尚未关闭时,如果检测到事件发生,则运行关联的事件处理程序函数。
绑定事件后,mainloop进入到到事件循环,一旦检测到事件,就刷新组件,譬如你输入一个字符,就要立即在光标那个位置显示出来。
通俗点来说:每个部件都相当于一个连环画,而组成在一起后,mainloop就相当于翻这些连环画 -
Tkinter之pack篇:
pack是一个布局管理器,可以将它视为一个弹性容器。
1、pack函数布局的时候,默认先使用的放到上面,然后依次向下排列,默认方式它会给我们的组件一个自认为合适的位置和大小。
2、pack函数也可以接受几个参数,side参数,指定了它停靠在哪个方向,可以为LEFT,TOP,RIGHT,BOTTOM,分别代表左,上,右,下,
它的fill参数可以是X,Y,BOTH,NONE即在水平方向填充,竖直方向填充,水平和竖直方向填充和不填充。
3、它的expand参数可以是YES 和 NO,它的anchor参数可以是N,E,S,W(这里的NESW分别表示北东南西,这里分别表示上右下左)以及他们的组合或者是CENTER(表示中间)
4、它的ipadx表示的是内边距的x方向,它的ipady表示的是内边距的y的方向,padx表示的是外边距的x方向,pady表示的是外边距的y方向。
PS:必须强调pack()布局和控件的先后顺序是相关的 -
Tkinter组件:
Button:按钮控件;在程序中显示按钮。
语法格式:w = Button ( master, option=value, ... )
master:按钮的父容器
1.activebackground
当鼠标放上去时,按钮的背景色
2.bd
按钮边框的大小,默认为 2 个像素
3.bg
按钮的背景色
4.fg
按钮的前景色(按钮文本的颜色)
5.font
文本字体
6.height
按钮的高度
7.width
按钮的宽度,默认为适应按钮的内容
8.anchor
锚选项,控制文本的位置,默认为中心
9.command
按钮关联的函数,当按钮被点击时,执行该函数
Entry:输入控件;用于显示简单的文本内容.
1.bg
输入框背景颜色
2.bd
边框大小
3.cursor
光标的形状设定
4.fg
文字颜色
5.font
文本字体
6.selectbackground
选中文字的背景颜色
7.selectborderwidth
选中文字背景边框宽度
8.selectforeground
选中文字颜色
9.show
指定文本框内容显示为字符。满足字符即可
10.textvariable
文本框的值,是一个StringVar()对象
11.width
文本框宽度
Frame: 框架控件;在屏幕上显示一个矩形区域,多用来作为容器.
Label:标签控件;可以显示文本和位图
Menu:菜单控件;显示菜单栏,下拉菜单和弹出菜单.
Text:文本控件;用于显示多行文本. -
Tkinter几何管理
pack(): 包装;
grid(): 网格;
place(): 位置;
链接:
PythonGUI编程(Tkinter)
关于tkinter的的布局管理pack()篇
Tkinter教程之Pack篇
- Python中eval用法
·eval()函数用来执行一个字符串表达式,并返回表达式的值
·eval(expression[, globals[, locals])
·eval()中必须是must be a string, bytes or code object
·必须是str(字符串的int) (字符串的float)
x = 7
eval( ‘3 * x’ )
21
eval(‘pow(2,2)’)#求2的2次方
4
代码实现:
import tkinter as tk
class Calculate(tk.Frame):
def __init__(self, parent = None): #初始化方法
"""计算器构造函数"""
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 = '#000', width = 64, anchor='w', 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 = 34, 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):
# 定义事件处理函数cmd(),默认参数为按钮标签buttons[r][c]
def cmd(key = buttons[r][c]):
self.click(key)
if(r == 0 or c == 3):
button = tk.Button(self, text = buttons[r][c], bg = '#008c8c', fg = '#000',
width=16, font = ('Helvetica', 16), command = cmd)
else:
button = tk.Button(self, text = buttons[r][c], bg = '#fff', fg = '#666',
width=16, font = ('Helvetica', 16), command = cmd)
button.grid(row = r+2, column = c) #前两行用于结果显示,按钮从第三行开始
def click(self, key):
if key == '=': #按等号键时, 求值, 并显示结果
resultExpr = self.expr.get() + self.result.get()
resultNum=eval(resultExpr)
self.result.set(resultNum)
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 == '±': # 正负号,切换正负号
oldnum = self.result.get() # 获取原来的值
if oldnum[0] == '-':
newnum = oldnum[1:] #如果是复数的话从第一个开始取
else:
newnum = '-' + oldnum#如果是正数的话前面加上负号
self.result.set(newnum)
else: # 按数字或者小数点键
if self.startOfNextOperand:
self.result.set(0)
self.startOfNextOperand = False #使得输出结果不会叠加占用,如果为True的话
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() #进入到事件循环