その時々

その時々で違うんです。特に決まっていないんです。

python電卓

pythonで電卓を作ってみました。
ロジックは
http://web.hc.keio.ac.jp/~fujimura/lang/page-18-3.html
を参考にしてみました。

それにしてもしょぼいコーディングです。
もう少し上達したらどんなコーディングができるかの指標とでもしますか。

ちなみにpythonさえ入っていればWindowsでもLinuxでもMacでも動くんじゃないでしょうか。

#!/usr/bin/python
#_*_ coding:UTF-8 _*_

from Tkinter import *

root = Tk()
root.geometry('180x130+50+20')
root.title('Python電卓')

t = DoubleVar()
t.set(0)

state = [0] # 0:最初の数値 1:演算子 2:= 3:最初以外の数値
reg = [0]
op = ['']

def num():
    inum = [0]
    def inputnum(x):
        if state[0] == 1:
            inum[0] = x
            t.set(x)

        else:
            inum[0] = inum[0] * 10 + x
            t.set(inum[0])

        if state[0] == 2:
            state[0] = 0
        elif state[0] == 1:
            state[0] = 3

    return inputnum

def calc(x):
    if state[0] == 0:
        reg[0] = t.get()
        op[0] = x
    elif state[0] == 1:
        op[0] = x
    elif state[0] == 2:
        if op[0] == '+':
            reg[0] = reg[0] + t.get()
        elif op[0] == '-':
            reg[0] = reg[0] - t.get()
        elif op[0] == '*':
            reg[0] = reg[0] * t.get()
        elif op[0] == '/':
            reg[0] = reg[0] / t.get()
        op[0] = x
    elif state[0] == 3:
        if op[0] == '+':
            reg[0] = reg[0] + t.get()
        elif op[0] == '-':
            reg[0] = reg[0] - t.get()
        elif op[0] == '*':
            reg[0] = reg[0] * t.get()
        elif op[0] == '/':
            reg[0] = reg[0] / t.get()
        t.set(reg[0])
        op[0] = x
    state[0] = 1

def equal():
    if state[0] == 0 or state[0] == 3:
        if op[0] == '+':
            t.set(reg[0] + t.get())
        elif op[0] == '-':
            t.set(reg[0] - t.get())
        elif op[0] == '*':
            t.set(reg[0] * t.get())
        elif op[0] == '/':
            t.set(reg[0] / t.get())

def clear():
    t.set(0)
    reg[0] = 0
    state[0] = 1


L = Label(textvariable=t, fg='red',width=15, anchor='e').grid(columnspan=5, row=1)
n = 1
nm = num()

for i in range(3):
    for j in range(3):
        bf = lambda x=n:nm(x)
        Button(text=str(n), padx=15, command=bf).grid(column=j, row=i+2)
        n += 1

bf = lambda x=0:nm(x)
Button(text="0", padx=15, command=bf).grid(column=0, row=5)
Button(text="C", padx=15, command=clear).grid(column=1, row=5)
Button(text="=", padx=15, command=equal).grid(column=2, row=5)
Button(text="÷", padx=15, command=lambda x='/':calc(x)).grid(column=3, row=2)
Button(text="×", padx=15, command=lambda x='*':calc(x)).grid(column=3, row=3)
Button(text="−", padx=15, command=lambda x='-':calc(x)).grid(column=3, row=4)
Button(text="+", padx=15, command=lambda x='+':calc(x)).grid(column=3, row=5)

mainloop()