最終的運行效果圖(程序見序號7):
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# ------------------------------------------------------------
#
# 參考資料:
# tkinter事件之bind - 鵠望 - 博客園
# https://www.cnblogs.com/huwang-sun/p/7064048.html
#
# Python 3 Tkinter教程之事件Event綁定處理代碼實例_python_編程語言_169IT.COM
# http://www.169it.com/article/11243858854023511493.html
#
# python Tkinter之Button - 一杯明月 - 博客園
# https://www.cnblogs.com/yibeimingyue/p/9395219.html
#
#
# 80行代碼使用Python+tkinter實現一個計算器 - CSDN博客
# https://blog.csdn.net/oh5W6HinUg43JvRhhB/article/details/78804200
#
# python 3.+版 計算器 - CSDN博客
# https://blog.csdn.net/xueshao110/article/details/78973416
#
# Python(16)python使用tkinter實現一個簡單的計算器 - CSDN博客
# https://blog.csdn.net/wizblack/article/details/78932258
#
# ------------------------------------------------------------
# ******************** project1_calculator *******************
# ******************** project1_calculator *******************
# =====>>>>>>內容概覽
# =====>>>>>>內容概覽
'''
# ------------------------------------------------------------
# # 1、窗口以及相關的菜單欄
# ------------------------------------------------------------
# ------------------------------------------------------------
# # 2、建立按鈕
# ------------------------------------------------------------
# ------------------------------------------------------------
# # 3、設置顯示框, 將輸入綁定到顯示框
# # # 增加位置: def __init__(self):; def click_button(self, event):
# ------------------------------------------------------------
# ------------------------------------------------------------
# # 4、實現基本的計算器功能
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
# ------------------------------------------------------------
# # 5、實現基本的計算器功能,補充錯誤檢測
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
# ------------------------------------------------------------
# # 6、實現基本的計算器功能,補充錯誤檢測,補充‘C’後退輸入功能
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
# ------------------------------------------------------------
# # 7、(完成全部設計)實現基本的計算器功能,補充錯誤檢測, 修改‘C’爲清楚功能, '<=='爲後退功能
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
'''
# ------------------------------------------------分割線-------------------------------------------------
# ------------------------------------------------分割線-------------------------------------------------
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 1、窗口以及相關的菜單欄
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240,325)
self.window.maxsize(240, 325)
# 設置菜單
self.set_menu()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
start = Calculator()
運行效果圖1:
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 2、建立按鈕
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240,325)
self.window.maxsize(240, 325)
# 是否清空顯示框判定參數
# ????
# 設置菜單
self.set_menu()
# 設置按鈕組件
self.set_buttons()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
def set_buttons(self):
# 基礎座標, x0, y0,開始座標; x_width, y_width 間隔
x0, y0, x_width, y_width,height = 0, 90, 60, 40, 40
# 7
btn7 = self.tk.Button(text='7', bd=2, font='黑體')
btn7.place( x=x0, y=y0, width=x_width, height=y_width)
# 8
btn8 = self.tk.Button(text='8', bd=2, font='黑體')
btn8.place( x=x0+x_width*1, y=y0, width=x_width, height=y_width)
# 9
btn9 = self.tk.Button(text='9', bd=2, font='黑體')
btn9.place( x=x0+x_width*2, y=y0, width=x_width, height=y_width)
# +
btn_add = self.tk.Button(text='+', bd=2, font='黑體')
btn_add.place( x=x0+x_width*3, y=y0, width=x_width, height=y_width)
# 4
btn4 = self.tk.Button(text='4', bd=2, font='黑體')
btn4.place( x=x0, y=y0+y_width, width=x_width, height=y_width)
# 5
btn5 = self.tk.Button(text='5', bd=2, font='黑體')
btn5.place( x=x0+x_width*1, y=y0+y_width, width=x_width, height=y_width)
# 6
btn6 = self.tk.Button(text='6', bd=2, font='黑體')
btn6.place( x=x0+x_width*2, y=y0+y_width, width=x_width, height=y_width)
# -
btn_subtract = self.tk.Button(text='-', bd=2, font='黑體')
btn_subtract.place( x=x0+x_width*3, y=y0+y_width, width=x_width, height=y_width)
# 1
btn1 = self.tk.Button(text='1', bd=2, font='黑體')
btn1.place( x=x0, y=y0+y_width*2, width=x_width, height=y_width)
# 2
btn2 = self.tk.Button(text='2', bd=2, font='黑體')
btn2.place( x=x0+x_width*1, y=y0+y_width*2, width=x_width, height=y_width)
# 3
btn3 = self.tk.Button(text='3', bd=2, font='黑體')
btn3.place( x=x0+x_width*2, y=y0+y_width*2, width=x_width, height=y_width)
# *
btn_mutiply = self.tk.Button(text='*', bd=2, font='黑體')
btn_mutiply.place( x=x0+x_width*3, y=y0+y_width*2, width=x_width, height=y_width)
# 0
btn0 = self.tk.Button(text='0', bd=2, font='黑體')
btn0.place( x=x0, y=y0+y_width*3, width=x_width*2, height=y_width)
# .
btn_point = self.tk.Button(text='.', bd=2, font='黑體')
btn_point.place( x=x0+x_width*2, y=y0+y_width*3, width=x_width, height=y_width)
# /
btn_divid = self.tk.Button(text='/', bd=2, font='黑體')
btn_divid.place( x=x0+x_width*3, y=y0+y_width*3, width=x_width, height=y_width)
# C後退
btn_back = self.tk.Button( text='C', bd=2, font='黑體')
btn_back.place( x=x0, y=y0+y_width*4, width=x_width*1, height=y_width)
# =
btn_equal = self.tk.Button( text='=', bd=2, font='黑體')
btn_equal.place( x=x0+x_width*1, y=y0+y_width*4, width=x_width*3, height=y_width)
start = Calculator()
運行效果圖2:
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 3、設置顯示框, 將輸入綁定到顯示框
# # # 增加位置: def __init__(self):; def click_button(self, event):
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240, 290)
self.window.maxsize(240, 290)
# 是否清空顯示框判定參數
# ????
# 設置菜單
self.set_menu()
# 設置顯示框
self.label_show = self.tk.Label(text='', anchor='se', font=('黑體', 30), fg='black')
self.label_show.place(x=0, y=0, width=240,height=80)
# 設置按鈕組件
self.set_buttons()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
def set_buttons(self):
# 基礎座標, x0, y0,開始座標; x_width, y_width 間隔
x0, y0, x_width, y_width,height = 0, 90, 60, 40, 40
# 7
btn7 = self.tk.Button(text='7', bd=2, font='黑體')
btn7.place( x=x0, y=y0, width=x_width, height=y_width)
# 8
btn8 = self.tk.Button(text='8', bd=2, font='黑體')
btn8.place( x=x0+x_width*1, y=y0, width=x_width, height=y_width)
# 9
btn9 = self.tk.Button(text='9', bd=2, font='黑體')
btn9.place( x=x0+x_width*2, y=y0, width=x_width, height=y_width)
# +
btn_add = self.tk.Button(text='+', bd=2, font='黑體')
btn_add.place( x=x0+x_width*3, y=y0, width=x_width, height=y_width)
# 4
btn4 = self.tk.Button(text='4', bd=2, font='黑體')
btn4.place( x=x0, y=y0+y_width, width=x_width, height=y_width)
# 5
btn5 = self.tk.Button(text='5', bd=2, font='黑體')
btn5.place( x=x0+x_width*1, y=y0+y_width, width=x_width, height=y_width)
# 6
btn6 = self.tk.Button(text='6', bd=2, font='黑體')
btn6.place( x=x0+x_width*2, y=y0+y_width, width=x_width, height=y_width)
# -
btn_subtract = self.tk.Button(text='-', bd=2, font='黑體')
btn_subtract.place( x=x0+x_width*3, y=y0+y_width, width=x_width, height=y_width)
# 1
btn1 = self.tk.Button(text='1', bd=2, font='黑體')
btn1.place( x=x0, y=y0+y_width*2, width=x_width, height=y_width)
# 2
btn2 = self.tk.Button(text='2', bd=2, font='黑體')
btn2.place( x=x0+x_width*1, y=y0+y_width*2, width=x_width, height=y_width)
# 3
btn3 = self.tk.Button(text='3', bd=2, font='黑體')
btn3.place( x=x0+x_width*2, y=y0+y_width*2, width=x_width, height=y_width)
# *
btn_mutiply = self.tk.Button(text='*', bd=2, font='黑體')
btn_mutiply.place( x=x0+x_width*3, y=y0+y_width*2, width=x_width, height=y_width)
# 0
btn0 = self.tk.Button(text='0', bd=2, font='黑體')
btn0.place( x=x0, y=y0+y_width*3, width=x_width*2, height=y_width)
# .
btn_point = self.tk.Button(text='.', bd=2, font='黑體')
btn_point.place( x=x0+x_width*2, y=y0+y_width*3, width=x_width, height=y_width)
# /
btn_divid = self.tk.Button(text='/', bd=2, font='黑體')
btn_divid.place( x=x0+x_width*3, y=y0+y_width*3, width=x_width, height=y_width)
# C後退
btn_back = self.tk.Button( text='C', bd=2, font='黑體')
btn_back.place( x=x0, y=y0+y_width*4, width=x_width*1, height=y_width)
# =
btn_equal = self.tk.Button( text='=', bd=2, font='黑體')
btn_equal.place( x=x0+x_width*1, y=y0+y_width*4, width=x_width*3, height=y_width)
# 綁定Button的點擊事件
btn7.bind_class('Button', '<Button-1>', self.click_button)
def click_button(self, event):
# 輸入的按鍵信息
input_event = event.widget['text']
# 輸入的按鍵信息顯示
self.label_show['text'] = self.label_show['text'] + input_event
start = Calculator()
運行效果圖3:
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 4、實現基本的計算器功能
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240, 290)
self.window.maxsize(240, 290)
# 是否清空顯示框判定參數
# ????
# 設置菜單
self.set_menu()
# 設置顯示框
self.label_show = self.tk.Label(text='', anchor='se', font=('黑體', 30), fg='black')
self.label_show.place(x=0, y=0, width=240,height=80)
# 設置按鈕組件
self.set_buttons()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
def set_buttons(self):
# 基礎座標, x0, y0,開始座標; x_width, y_width 間隔
x0, y0, x_width, y_width,height = 0, 90, 60, 40, 40
# 7
btn7 = self.tk.Button(text='7', bd=2, font='黑體')
btn7.place( x=x0, y=y0, width=x_width, height=y_width)
# 8
btn8 = self.tk.Button(text='8', bd=2, font='黑體')
btn8.place( x=x0+x_width*1, y=y0, width=x_width, height=y_width)
# 9
btn9 = self.tk.Button(text='9', bd=2, font='黑體')
btn9.place( x=x0+x_width*2, y=y0, width=x_width, height=y_width)
# +
btn_add = self.tk.Button(text='+', bd=2, font='黑體')
btn_add.place( x=x0+x_width*3, y=y0, width=x_width, height=y_width)
# 4
btn4 = self.tk.Button(text='4', bd=2, font='黑體')
btn4.place( x=x0, y=y0+y_width, width=x_width, height=y_width)
# 5
btn5 = self.tk.Button(text='5', bd=2, font='黑體')
btn5.place( x=x0+x_width*1, y=y0+y_width, width=x_width, height=y_width)
# 6
btn6 = self.tk.Button(text='6', bd=2, font='黑體')
btn6.place( x=x0+x_width*2, y=y0+y_width, width=x_width, height=y_width)
# -
btn_subtract = self.tk.Button(text='-', bd=2, font='黑體')
btn_subtract.place( x=x0+x_width*3, y=y0+y_width, width=x_width, height=y_width)
# 1
btn1 = self.tk.Button(text='1', bd=2, font='黑體')
btn1.place( x=x0, y=y0+y_width*2, width=x_width, height=y_width)
# 2
btn2 = self.tk.Button(text='2', bd=2, font='黑體')
btn2.place( x=x0+x_width*1, y=y0+y_width*2, width=x_width, height=y_width)
# 3
btn3 = self.tk.Button(text='3', bd=2, font='黑體')
btn3.place( x=x0+x_width*2, y=y0+y_width*2, width=x_width, height=y_width)
# *
btn_mutiply = self.tk.Button(text='*', bd=2, font='黑體')
btn_mutiply.place( x=x0+x_width*3, y=y0+y_width*2, width=x_width, height=y_width)
# 0
btn0 = self.tk.Button(text='0', bd=2, font='黑體')
btn0.place( x=x0, y=y0+y_width*3, width=x_width*2, height=y_width)
# .
btn_point = self.tk.Button(text='.', bd=2, font='黑體')
btn_point.place( x=x0+x_width*2, y=y0+y_width*3, width=x_width, height=y_width)
# /
btn_divid = self.tk.Button(text='/', bd=2, font='黑體')
btn_divid.place( x=x0+x_width*3, y=y0+y_width*3, width=x_width, height=y_width)
# C後退
btn_back = self.tk.Button( text='C', bd=2, font='黑體')
btn_back.place( x=x0, y=y0+y_width*4, width=x_width*1, height=y_width)
# =
btn_equal = self.tk.Button( text='=', bd=2, font='黑體')
btn_equal.place( x=x0+x_width*1, y=y0+y_width*4, width=x_width*3, height=y_width)
# 綁定Button的點擊事件
btn7.bind_class('Button', '<Button-1>', self.click_button)
def click_button(self, event):
# 輸入的按鍵信息
input_event = event.widget['text']
# 輸入的按鍵信息顯示
self.label_show['text'] = self.label_show['text'] + input_event
# 進行普通計算
if event.widget['text'] == '=':
res_bit = 2 # 計算保留的位數
res = eval(self.label_show['text'][:-1]) # 計算點擊 “=” 之前的計算表達式
# print(type(res))
self.label_show['text'] = str(round(float(res), res_bit ))
start = Calculator()
運行效果圖4:
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 5、實現基本的計算器功能,補充錯誤檢測
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240, 290)
self.window.maxsize(240, 290)
# 是否清空顯示框判定參數
# ????
# 設置菜單
self.set_menu()
# 設置顯示框
self.label_show = self.tk.Label(text='', anchor='se', font=('黑體', 30), fg='black')
self.label_show.place(x=0, y=0, width=240,height=80)
# 設置按鈕組件
self.set_buttons()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
def set_buttons(self):
# 基礎座標, x0, y0,開始座標; x_width, y_width 間隔
x0, y0, x_width, y_width,height = 0, 90, 60, 40, 40
# 7
btn7 = self.tk.Button(text='7', bd=2, font='黑體')
btn7.place( x=x0, y=y0, width=x_width, height=y_width)
# 8
btn8 = self.tk.Button(text='8', bd=2, font='黑體')
btn8.place( x=x0+x_width*1, y=y0, width=x_width, height=y_width)
# 9
btn9 = self.tk.Button(text='9', bd=2, font='黑體')
btn9.place( x=x0+x_width*2, y=y0, width=x_width, height=y_width)
# +
btn_add = self.tk.Button(text='+', bd=2, font='黑體')
btn_add.place( x=x0+x_width*3, y=y0, width=x_width, height=y_width)
# 4
btn4 = self.tk.Button(text='4', bd=2, font='黑體')
btn4.place( x=x0, y=y0+y_width, width=x_width, height=y_width)
# 5
btn5 = self.tk.Button(text='5', bd=2, font='黑體')
btn5.place( x=x0+x_width*1, y=y0+y_width, width=x_width, height=y_width)
# 6
btn6 = self.tk.Button(text='6', bd=2, font='黑體')
btn6.place( x=x0+x_width*2, y=y0+y_width, width=x_width, height=y_width)
# -
btn_subtract = self.tk.Button(text='-', bd=2, font='黑體')
btn_subtract.place( x=x0+x_width*3, y=y0+y_width, width=x_width, height=y_width)
# 1
btn1 = self.tk.Button(text='1', bd=2, font='黑體')
btn1.place( x=x0, y=y0+y_width*2, width=x_width, height=y_width)
# 2
btn2 = self.tk.Button(text='2', bd=2, font='黑體')
btn2.place( x=x0+x_width*1, y=y0+y_width*2, width=x_width, height=y_width)
# 3
btn3 = self.tk.Button(text='3', bd=2, font='黑體')
btn3.place( x=x0+x_width*2, y=y0+y_width*2, width=x_width, height=y_width)
# *
btn_mutiply = self.tk.Button(text='*', bd=2, font='黑體')
btn_mutiply.place( x=x0+x_width*3, y=y0+y_width*2, width=x_width, height=y_width)
# 0
btn0 = self.tk.Button(text='0', bd=2, font='黑體')
btn0.place( x=x0, y=y0+y_width*3, width=x_width*2, height=y_width)
# .
btn_point = self.tk.Button(text='.', bd=2, font='黑體')
btn_point.place( x=x0+x_width*2, y=y0+y_width*3, width=x_width, height=y_width)
# /
btn_divid = self.tk.Button(text='/', bd=2, font='黑體')
btn_divid.place( x=x0+x_width*3, y=y0+y_width*3, width=x_width, height=y_width)
# C後退
btn_back = self.tk.Button( text='C', bd=2, font='黑體')
btn_back.place( x=x0, y=y0+y_width*4, width=x_width*1, height=y_width)
# =
btn_equal = self.tk.Button( text='=', bd=2, font='黑體')
btn_equal.place( x=x0+x_width*1, y=y0+y_width*4, width=x_width*3, height=y_width)
# 綁定Button的點擊事件
btn7.bind_class('Button', '<Button-1>', self.click_button)
def click_button(self, event):
# 輸入的按鍵信息
input_event = event.widget['text']
# 輸入的按鍵信息顯示
self.label_show['text'] = self.label_show['text'] + input_event
# 進行普通計算
if event.widget['text'] == '=':
try:
res_bit = 2 # 計算保留的位數
res = eval(self.label_show['text'][:-1]) # 計算點擊 “=” 之前的計算表達式
# print(type(res))
self.label_show['text'] = str(round(float(res), res_bit))
except ZeroDivisionError:
# 除法時,除數不能爲0
self.mbox.showerror(title='錯誤', message='除法計算時!除數不能爲0!')
except:
self.mbox.showerror(title='未知名錯誤', message='算式錯誤,請檢查!')
start = Calculator()
運行效果圖5:
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 6、實現基本的計算器功能,補充錯誤檢測,補充‘C’後退輸入功能
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240, 290)
self.window.maxsize(240, 290)
# 是否清空顯示框判定參數
# ????
# 設置菜單
self.set_menu()
# 設置顯示框
self.label_show = self.tk.Label(text='', anchor='se', font=('黑體', 30), fg='black')
self.label_show.place(x=0, y=0, width=240,height=80)
# 設置按鈕組件
self.set_buttons()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
def set_buttons(self):
# 基礎座標, x0, y0,開始座標; x_width, y_width 間隔
x0, y0, x_width, y_width,height = 0, 90, 60, 40, 40
# 7
btn7 = self.tk.Button(text='7', bd=2, font='黑體')
btn7.place( x=x0, y=y0, width=x_width, height=y_width)
# 8
btn8 = self.tk.Button(text='8', bd=2, font='黑體')
btn8.place( x=x0+x_width*1, y=y0, width=x_width, height=y_width)
# 9
btn9 = self.tk.Button(text='9', bd=2, font='黑體')
btn9.place( x=x0+x_width*2, y=y0, width=x_width, height=y_width)
# +
btn_add = self.tk.Button(text='+', bd=2, font='黑體')
btn_add.place( x=x0+x_width*3, y=y0, width=x_width, height=y_width)
# 4
btn4 = self.tk.Button(text='4', bd=2, font='黑體')
btn4.place( x=x0, y=y0+y_width, width=x_width, height=y_width)
# 5
btn5 = self.tk.Button(text='5', bd=2, font='黑體')
btn5.place( x=x0+x_width*1, y=y0+y_width, width=x_width, height=y_width)
# 6
btn6 = self.tk.Button(text='6', bd=2, font='黑體')
btn6.place( x=x0+x_width*2, y=y0+y_width, width=x_width, height=y_width)
# -
btn_subtract = self.tk.Button(text='-', bd=2, font='黑體')
btn_subtract.place( x=x0+x_width*3, y=y0+y_width, width=x_width, height=y_width)
# 1
btn1 = self.tk.Button(text='1', bd=2, font='黑體')
btn1.place( x=x0, y=y0+y_width*2, width=x_width, height=y_width)
# 2
btn2 = self.tk.Button(text='2', bd=2, font='黑體')
btn2.place( x=x0+x_width*1, y=y0+y_width*2, width=x_width, height=y_width)
# 3
btn3 = self.tk.Button(text='3', bd=2, font='黑體')
btn3.place( x=x0+x_width*2, y=y0+y_width*2, width=x_width, height=y_width)
# *
btn_mutiply = self.tk.Button(text='*', bd=2, font='黑體')
btn_mutiply.place( x=x0+x_width*3, y=y0+y_width*2, width=x_width, height=y_width)
# 0
btn0 = self.tk.Button(text='0', bd=2, font='黑體')
btn0.place( x=x0, y=y0+y_width*3, width=x_width*2, height=y_width)
# .
btn_point = self.tk.Button(text='.', bd=2, font='黑體')
btn_point.place( x=x0+x_width*2, y=y0+y_width*3, width=x_width, height=y_width)
# /
btn_divid = self.tk.Button(text='/', bd=2, font='黑體')
btn_divid.place( x=x0+x_width*3, y=y0+y_width*3, width=x_width, height=y_width)
# C後退
btn_back = self.tk.Button( text='C', bd=2, font='黑體')
btn_back.place( x=x0, y=y0+y_width*4, width=x_width*1, height=y_width)
# =
btn_equal = self.tk.Button( text='=', bd=2, font='黑體')
btn_equal.place( x=x0+x_width*1, y=y0+y_width*4, width=x_width*3, height=y_width)
# 綁定Button的點擊事件
btn7.bind_class('Button', '<Button-1>', self.click_button)
def click_button(self, event):
# 輸入的按鍵信息
input_event = event.widget['text']
# 輸入的按鍵信息顯示
self.label_show['text'] = self.label_show['text'] + input_event
# 進行普通計算
if event.widget['text'] == '=':
try:
res_bit = 2 # 計算保留的位數
res = eval(self.label_show['text'][:-1]) # 計算點擊 “=” 之前的計算表達式
# print(type(res))
self.label_show['text'] = str(round(float(res), res_bit))
except ZeroDivisionError:
# 除法時,除數不能爲0
self.mbox.showerror(title='錯誤', message='除法計算時!除數不能爲0!')
except:
self.mbox.showerror(title='未知名錯誤', message='算式錯誤,請檢查!')
elif event.widget['text'] == 'C':
back_res = self.label_show['text'][:-2] # 點擊的‘C’也計算在內,因此是倒數2位去掉
self.label_show['text'] = back_res
start = Calculator()
運行效果圖6:
# ------------------------------------------------分割線-------------------------------------------------
'''
# ------------------------------------------------------------
# # 7、(完成全部設計)實現基本的計算器功能,補充錯誤檢測, 修改‘C’爲清楚功能, '<=='爲後退功能
# # # 改動位置位置: def click_button(self, event):
# ------------------------------------------------------------
'''
class Calculator:
import tkinter as tk
import tkinter.messagebox as mbox
def __init__(self):
# 生成一個窗口對象
self.window = self.tk.Tk()
# 命名窗口對象的顯示title
self.window.title('計算器')
# 設置窗口的大小 minsize最小 maxsize最大
self.window.minsize(240, 290)
self.window.maxsize(240, 290)
# 是否清空顯示框判定參數
# ????
# 設置菜單
self.set_menu()
# 設置顯示框
self.label_show = self.tk.Label(text='', anchor='se', font=('黑體', 30), fg='black')
self.label_show.place(x=0, y=0, width=240,height=80)
# 設置按鈕組件
self.set_buttons()
# 將窗口放入主消息隊列
self.window.mainloop()
def set_menu(self):
'''
設置菜單
:return: None
'''
# 創建總菜單
menubar = self.tk.Menu(self.window)
# 創建一個下拉菜單,並且加入文件菜單
filemenu = self.tk.Menu(menubar, tearoff=False)
# 創建菜單中的選項
filemenu.add_command(label='退出計算器', command=self.window.quit )
# print author的函數
def show_author():
self.mbox.showinfo(title='作者信息',message='作者:JY小腳丫\n聯繫郵箱:******[email protected]')
filemenu.add_command(label='作者信息', command=show_author)
# 將文件菜單作爲下拉菜單添加到總菜單中,並且將命名爲操作
menubar.add_cascade(label='查看', menu=filemenu)
# 顯示總菜單
self.window.config(menu=menubar)
def set_buttons(self):
# 基礎座標, x0, y0,開始座標; x_width, y_width 間隔
x0, y0, x_width, y_width,height = 0, 90, 60, 40, 40
# 7
btn7 = self.tk.Button(text='7', bd=2, font='黑體')
btn7.place( x=x0, y=y0, width=x_width, height=y_width)
# 8
btn8 = self.tk.Button(text='8', bd=2, font='黑體')
btn8.place( x=x0+x_width*1, y=y0, width=x_width, height=y_width)
# 9
btn9 = self.tk.Button(text='9', bd=2, font='黑體')
btn9.place( x=x0+x_width*2, y=y0, width=x_width, height=y_width)
# +
btn_add = self.tk.Button(text='+', bd=2, font='黑體')
btn_add.place( x=x0+x_width*3, y=y0, width=x_width, height=y_width)
# 4
btn4 = self.tk.Button(text='4', bd=2, font='黑體')
btn4.place( x=x0, y=y0+y_width, width=x_width, height=y_width)
# 5
btn5 = self.tk.Button(text='5', bd=2, font='黑體')
btn5.place( x=x0+x_width*1, y=y0+y_width, width=x_width, height=y_width)
# 6
btn6 = self.tk.Button(text='6', bd=2, font='黑體')
btn6.place( x=x0+x_width*2, y=y0+y_width, width=x_width, height=y_width)
# -
btn_subtract = self.tk.Button(text='-', bd=2, font='黑體')
btn_subtract.place( x=x0+x_width*3, y=y0+y_width, width=x_width, height=y_width)
# 1
btn1 = self.tk.Button(text='1', bd=2, font='黑體')
btn1.place( x=x0, y=y0+y_width*2, width=x_width, height=y_width)
# 2
btn2 = self.tk.Button(text='2', bd=2, font='黑體')
btn2.place( x=x0+x_width*1, y=y0+y_width*2, width=x_width, height=y_width)
# 3
btn3 = self.tk.Button(text='3', bd=2, font='黑體')
btn3.place( x=x0+x_width*2, y=y0+y_width*2, width=x_width, height=y_width)
# *
btn_mutiply = self.tk.Button(text='*', bd=2, font='黑體')
btn_mutiply.place( x=x0+x_width*3, y=y0+y_width*2, width=x_width, height=y_width)
# 0
btn0 = self.tk.Button(text='0', bd=2, font='黑體')
btn0.place( x=x0, y=y0+y_width*3, width=x_width*2, height=y_width)
# .
btn_point = self.tk.Button(text='.', bd=2, font='黑體')
btn_point.place( x=x0+x_width*2, y=y0+y_width*3, width=x_width, height=y_width)
# /
btn_divid = self.tk.Button(text='/', bd=2, font='黑體')
btn_divid.place( x=x0+x_width*3, y=y0+y_width*3, width=x_width, height=y_width)
# C後退
btn_clear = self.tk.Button( text='C', bd=2, font='黑體')
btn_clear.place( x=x0, y=y0+y_width*4, width=x_width, height=y_width)
# C後退
btn_back = self.tk.Button( text='<==', bd=2, font='黑體')
btn_back.place( x=x0+x_width*1, y=y0+y_width*4, width=x_width, height=y_width)
# =
btn_equal = self.tk.Button( text='=', bd=2, font='黑體')
btn_equal.place( x=x0+x_width*2, y=y0+y_width*4, width=x_width*2, height=y_width)
# 綁定Button的點擊事件
btn7.bind_class('Button', '<Button-1>', self.click_button)
def click_button(self, event):
# 獲取點擊的按鈕信息信息
input_event = event.widget['text']
# 輸入的按鈕信息顯示
self.label_show['text'] = self.label_show['text'] + input_event
# 異常捕獲
try:
# 計算符號
cal_symbol = ['+', '-', '*', '/']
# 判定運算符號重複的時候,使用最後輸入的符號
if self.label_show['text'][-1] in cal_symbol and self.label_show['text'][-2] in cal_symbol:
# 取重複符號前面的內容
header = self.label_show['text'][:-2]
footer = self.label_show['text'][-1]
self.label_show['text'] = header + footer
except:
pass
# 進行普通計算
if event.widget['text'] == '=':
# 異常捕獲
try:
res_bit = 2 # 計算保留的位數
res = eval(self.label_show['text'][:-1]) # 計算點擊 “=” 之前的計算表達式
# print(type(res))
self.label_show['text'] = str(round(float(res), res_bit))
except ZeroDivisionError:
# 除法時,除數不能爲0
self.mbox.showerror(title='錯誤', message='除法計算時!除數不能爲0!')
except:
self.mbox.showerror(title='未知名錯誤', message='算式錯誤,請檢查!')
elif event.widget['text'] == '<==':
# 點擊的‘<==’也計算在內,它佔3個字符,因此是倒數4位去掉
back_res = self.label_show['text'][:-4]
self.label_show['text'] = back_res
elif event.widget['text'] == 'C':
# 點擊的‘C’也計算在內,因此是倒數2位去掉
self.label_show['text'] = ''
start = Calculator()
運行效果圖7(最終的運行效果):