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

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

重播
播放
00:00 / 00:00 正在直播
00:00
进入全屏
50
点击按住可拖动视频

首先是构建显示区。这个显示区实际上是由一大一小两个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 font ftTimes24 = 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编程的简单程度。

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

https://github.com/xueweiguo/TkinterPrimer/blob/master/Sample/9%20Calculator.py

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

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

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

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

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片