---
# System prepended metadata

title: 用Python寫一個計算機

---

# 用Python寫一個計算機

### #1
```python=
import tkinter as tk

#創建主頁面
root = tk.Tk()
root.title("我的計算機")

# 輸入欄位
entry_var = tk.StringVar()
#一個可以輸入字的一個框框
entry = tk.Entry(root,textvariable=entry_var, justify='right',font=('Arial',20))
entry.grid(row=0, column=0, columnspan=4, sticky='nsew')

#添加按鈕
Button = ['1', '2', '3', '+', '4', '5', '6', '-', '7', '8', '9', '*', '0', '=', 'C', '/']

#一種迴圈結構，同時會有遍歷目標list(Button)並且會有Index的存在
#這邊就會像是
#index: 0,(Button)value: 1 => '1'
for i, Button in enumerate(Button):
    #設定按鈕的樣子
    #創建了一個匿名函數（lambda表達式），
    #這個表達式將當前按鈕的標籤（button）作為參數傳遞給on_click函數。
    #這樣當按鈕被點擊時，on_click函數就會被調用，並且知道是哪個按鈕被點擊了。

    #以我懂得例子來說就是
    #Flutter在按鈕動作的時候會是
    #-----------------------------
    #ElevatedButton(
    #    onPressed: () {
    #    // 在這裡放置點擊按鈕後的邏輯
    #        print("按鈕被點擊了！");
    #    },
    #    child: Text('點擊我'),
    #)
    #-----------------------------
    #在python的GUI(tkinter)當中就會是command + lambda的方式去呈現
    #btn = tk.Button(root, text="點擊我", command=lambda: print("按鈕被點擊了！"))

    btn = tk.Button(root,text=Button,font=('Arial',20), command=lambda b=Button: on_click(b))
    #布局工具，這邊做到的是當迭代到第五項之前也就是 4 之前 都會被整除+1 併入第一列
    #至於行就會是每4個為一行
    btn.grid(row=(i//4)+1,column=i%4,sticky="nsew")
    #視窗可以動態擴展或收縮
    root.columnconfigure(i%4,weight=1)

def on_click(btn_txt):
    value_txt = entry_var.get()
    
    if btn_txt == "=":
        try:
            #eval方法是會計算數學運算的方式
            #在這邊的話，你會在點擊數字按鈕之後做的所有運算
            result = eval(value_txt)
            entry_var.set(result)
            
        except Exception:
            entry_var.set('error')
            
    elif btn_txt == "C":
        entry_var.set("") # 清除Entry的文本
       
    else:
        entry_var.set(value_txt + btn_txt)  # 將點擊的按鈕文本添加到Entry的當前文本
            
    

#執行視窗
root.mainloop()
```