龙空技术网

Tkinter编程应知应会(9)-简易计算器(含源代码链接)

面向对象思考 38

前言:

现时同学们对“tkinter做计算器”大致比较注重,各位老铁们都想要学习一些“tkinter做计算器”的相关知识。那么小编在网络上搜集了一些关于“tkinter做计算器””的相关内容,希望我们能喜欢,你们快快来了解一下吧!

控件的学习进行到一定程度之后,就可以开始编写简单的应用了。我们的第一个应用是一个简易计算器。先看动画:

视频加载中...

首先是构建显示区。这个显示区实际上是由一大一小两个Label控件构成的:

ftTimes12 = Font(family='Times', size=12, weight=BOLD)# create a label to change state.upper_display = Label(root, background="#a0ffa0",foreground="#000000", font=ftTimes12, width=24, anchor=E)upper_display.grid(row=0, column=0, columnspan=4, sticky=E+W)# create fontftTimes24 = Font(family='Times', size=24, weight=BOLD)# create a label to change state.lower_display = Label(root, background="#a0ffa0",foreground="#000000", font=ftTimes24, width=12, anchor=E)lower_display.grid(row=1, column=0, columnspan=4, sticky=E+W)

clear_result是一个共通函数。它首先判断是否刚刚完成计算,如果答案是肯定的,就会清除所有显示内容。

# 如果是刚刚完成计算,者接下来的任何操作都清楚所有显示内容def clear_result(): upper = upper_display.cget('text') if len(upper) > 0 and upper[len(upper) - 1] == '=': clear() return True else: return False

CE按钮的动作实际上是清除当前操作数:

# 清除操作数def clear_lower(): clear_result() lower_display.config(text='')# CE按钮.Button(root, text="CE", width=2, command=clear_lower).grid(row=2, column=0, sticky=E+W)

C按钮的动作是清除所有显示内容:

# 清除所有显示内容def clear(): upper_display.config(text='') lower_display.config(text='')# C按钮Button(root,text="C", width=2, command=clear).grid(row=2, column=1, sticky=E+W)

如果不是计算完成状态,则Back按钮的功能是去掉当前操作数的最后一个字符;如果是计算完成状态,这Back按钮的功能是清除所有显示.

#如果不是计算完成状态,去掉当前操作数的最后一个字符def back(): if not clear_result(): lower = str(lower_display.cget('text')) if len(lower) > 0: lower_display.config(text=lower[:len(lower)-1])# back button.Button(root,text="<-", width=2, command=back).grid(row=2, column=2, sticky=E+W)

接下来的四则运算符使用同一个命令函数,具体参数通过lambda表达式指定。这样就避免了为每个运算符按钮编写一个命令函数。

def add_op(op): clear_result() upper = upper_display.cget('text') lower = lower_display.cget('text') if len(lower)>0: upper_display.config(text=upper + lower + op) lower_display.config(text='')# change state button.Button(root,text="÷", width=2, command=lambda : add_op('÷')).grid(row=2, column=3, sticky=E+W)Button(root,text="×", width=2, command=lambda : add_op('×')).grid(row=3, column=3, sticky=E+W)Button(root,text="-", width=2, command=lambda : add_op('-')).grid(row=4, column=3, sticky=E+W)

数字按钮也一样:

def add_number(n): clear_result() lower = lower_display.cget('text') lower_display.config(text=lower + n)# change nubmer button.Button(root, text="7", width=2, command=lambda : add_number('7')).grid(row=3, column=0, sticky=E+W)Button(root, text="8", width=2, command=lambda : add_number('8')).grid(row=3, column=1, sticky=E+W)Button(root, text="9", width=2, command=lambda : add_number('9')).grid(row=3, column=2, sticky=E+W)Button(root, text="4", width=2, command=lambda : add_number('4')).grid(row=4, column=0, sticky=E+W)Button(root, text="5", width=2, command=lambda : add_number('5')).grid(row=4, column=1, sticky=E+W)Button(root, text="6", width=2, command=lambda : add_number('6')).grid(row=4, column=2, sticky=E+W)Button(root, text="1", width=2, command=lambda : add_number('1')).grid(row=5, column=0, sticky=E+W)Button(root, text="2", width=2, command=lambda : add_number('2')).grid(row=5, column=1, sticky=E+W)Button(root, text="3", width=2, command=lambda : add_number('3')).grid(row=5, column=2, sticky=E+W)Button(root, text="0", width=2, command=lambda : add_number('0')).grid(row=6, column=1, sticky=E+W)Button(root, text=".", width=2, command=lambda : add_number('.')).grid(row=6, column=2, sticky=E+W)

正负号按钮只对第一个操作数有效。

def plus_minus(): clear_result() upper = upper_display.cget('text') if len(upper) == 0: lower = lower_display.cget('text') if lower[0]=='-': lower_display.config(text=lower[1:]) else: lower_display.config(text='-' +lower)Button(root,text="+/-", width=2, command=plus_minus).grid(row=6, column=0, sticky=E+W)

求值按钮使用了Python语言的eval函数,从而避免了自己实现表达式解析。但是需要事先将表达式中'÷'和'×'替换为'/'和‘*’并去掉‘=’。

def calculate(): add_op('=') upper = upper_display.cget('text') upper = upper.replace('=', '') upper = upper.replace('÷', '/') upper = upper.replace('×', '*') result = format(eval(upper), 'g') lower_display.config(text=result)Button(root,text="=", width=2, command=calculate).grid(row=6, column=3, sticky=E+W)

这个计算器的功能并不完善,主要目的是展示Tkinter编程的简单程度。

完整代码可以从以下链接下载:

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。

面向对象设计,面向对象编程,面向对象思考!

标签: #tkinter做计算器