1. 程式人生 > >用python編譯簡易計算器

用python編譯簡易計算器

工具:python 3.6       pycharm編輯器

先簡單介紹一下使用的Tkinter圖形庫:

  •   Tk是Python預設的工具集(即圖形庫),Tkinter是Tk的Python介面,通過Tkinter可以方便地呼叫Tk進行圖形介面開發。
  •   Tk與其他開發庫相比,不是最強大的,模組工具也不是非常的豐富。但它非常簡單,所提供的功能開發一般的應用也完全夠用了,且能在大部分平臺上執行。
  •   Python自帶的IDEL也是用Tkinter開發的。
  •   Tkinter的不足之處是缺少合適的視覺化介面設計工具,需要通過程式碼來完成視窗設計和元素佈局。
  •   Tkinter中提供了較為豐富的控制元件,完全能滿足基本的GUI
    程式的需求。
  •   由於Tkinter模組已經在Python中內建,所以在使用之前,只需將其匯入即可。
  •   兩種匯入方式為:

       1.import tkinter as tk匯入tkinter,但沒引入任何元件,在使用時需要使用tk字首,如需要引入按鈕,則表示為:tk.Button

          2.from tkinter import* 將tkinter中的所有元件一次性引入。

好了,看程式碼吧

一. 匯入Tkinter模組,並建立一個頂層視窗

import math
from tkinter import *
root=Tk()
root.title("計算器")
'''
root.geometry("430x180")
root.resizable(width=False, height=False) #可用於固定視窗大小   '''

二. 定義滑鼠事件(這裡是為了美化計算器啦,也可以不要)

def come(event):   #當滑鼠光圈進入小部件時,部件背景顏色變為橙色
  event.widget["background"]= "orange"
def go(event):     #當滑鼠光圈離開小部件時,部件背景顏色恢復
  event.widget["background"] = "#%02x%02x%02x" % (240,240,240)#實現RGB和十六進位制的換算
三.定義輸入數字與符號函式
reset=True
def bprint(event):
    global label
    global reset
    s=label['text']
    num=event.widget['text']
    if num in ['C','MC','MR','MS']:
      label['text']="0"
      return
    if num in "=":   ##計算表示式
      if s[-1]=="√":
        label['text']=math.sqrt(eval(s[:-1]))
        return
      if s[-1]=="%":
        label['text']=eval(s[:-1])*0.01
        s=str(eval(s[:-1])*0.01)
        return
      if s[-1]=="x":
        label['text']=1/eval(s[:-3])
        s=str(1/eval(s[:-3]))
        return
      else:
        label['text']=eval(label['text'])  ###eval函式可以計算Python表示式,並返回結果
        reset=True
        return
      
    if num in "Backspace":         ####退格
      label['text']=s[:-1]
      return
    if s=='0' or reset==True:
        s=""
        reset=False
    label['text']=s+num

四. 定義標準計算器按鍵框

def standard():
  show=["MC","MR","MS","M+","M-","Backspace","CE","C","-","√",'7','8','9',"/","%",'4','5','6',"*","1/x",'1','2','3',"-","="]
  for i in range(5):
    for j in range(5):
      t=Button(root,text =show[5*i+j],width =10,height=1)
      t.grid(row=i+2,column =j,sticky =W,padx =1,pady=1)
      t.bind("<Enter>",come)
      t.bind("<Leave>",go)
      t.bind("<Button-1>",bprint)
  
  equal = Button(root,text="=",width =10,height =3)
  equal.grid(row=6,column =4,sticky =W,padx =1,pady=1,rowspan =2)
  equal.bind("<Enter>",come)
  equal.bind("<Leave>",go)
  equal.bind("<Button-1>",bprint)
     
  btn0 = Button(root,text ='0',width =22,height =1)
  btn0.grid(row=7,column =0,sticky =W,padx =1,pady=1,columnspan =2)   #讓一個部件佔用多個行或列。columnspan指定列數,rowspan指定行數。
  btn0.bind("<Enter>",come)
  btn0.bind("<Leave>",go)
  btn0.bind("<Button-1>",bprint)
  dot = Button(root,text =".",width =10,height =1)
  dot.grid(row=7,column =2,sticky =W,padx =1,pady=1)
  dot.bind("<Enter>",come)
  dot.bind("<Leave>",go)
  dot.bind("<Button-1>",bprint)
  add = Button(root,text ="+",width =10)
  add.grid(row=7,column =3,sticky =W,padx =1,pady=1)
  add.bind("<Enter>",come)
  add.bind("<Leave>",go)
  add.bind("<Button-1>",bprint)

五. 接下來是主函式

if __name__ == "__main__":
    
    #########################################選單設計
    menubar = Menu(root)

    #建立下拉選單檢視
    view_menu = Menu(menubar,tearoff = 0)  #tearoff = 0表示選單不能移除視窗,add_cascade新增選單標籤,add_command新增條目到選單。
    v_mode = IntVar()
    view_menu.add_radiobutton(label = "標準型",command=standard,variable = v_mode,value = 0)
    view_menu.add_radiobutton(label = "科學型",variable = v_mode,value = 1)
    view_menu.add_radiobutton(label = "程式設計師型",variable =v_mode,value = 2)
    view_menu.add_radiobutton(label = "統計型",variable = v_mode,value = 3)
    view_menu.add_separator()
    h_mode = IntVar()
    view_menu.add_radiobutton(label = "歷史記錄",variable = h_mode,value = 0)
    view_menu.add_radiobutton(label = "數字分組",variable = h_mode,value = 1)
    menubar.add_cascade(label = "檢視(V)",menu = view_menu)

    #建立下拉選單編輯 
    edit = Menu(menubar,tearoff = 0)
    edit.add_command(label = "複製")
    edit.add_command(label = "黏貼")
    menubar.add_cascade(label = "編輯(E)",menu = edit)

    #建立下拉選單幫助
    helpm = Menu(menubar,tearoff=0)
    helpm.add_command(label = "檢視幫助")
    helpm.add_command(label = "關於計算器")
    menubar.add_cascade(label = "幫助(H)",menu= helpm)

    #顯示選單
    root.config(menu = menubar)

    #####################################計算器顯示框
    label=Label(root,text="0",background="white",height=2,width=58,anchor="e")
    label.grid(row=1,columnspan=6,sticky=W)

    ################################顯示標準形式
    standard()
    root.mainloop()

六.最後附上我的效果圖

ps:因為功能並不很全,為避免執行後有的小夥伴疑惑,下面簡要說明一下bug,有大神能解答歡迎指教(^_^)

bug說明:

1.第一排鍵我也不知道是幹嘛的,所以都變成了清零尷尬

2.選單欄還都只是擺設

3.可以連續加減乘除,但不能再結果上繼續計算,需要先清零