控件的学习进行到一定程度之后,就可以开始编写简单的应用了。我们的第一个应用是一个简易计算器。先看动画:
重播
播放
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 FalseCE按钮的动作实际上是清除当前操作数:
# 清除操作数 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