Code

python UDP Calculator

BIGFROG 2022. 5. 9. 23:48

server.py

from socket import *
import signal
import sys


def signal_handler(signal, frame):
    print("signal handler is called.")
    sys.exit(0)


def main():

    signal.signal(signal.SIGINT, signal_handler)
    serverPort = 12000
    serverSocket = socket(AF_INET, SOCK_DGRAM)
    serverSocket.bind(('', serverPort))
    print("The Server is ready to receive.")

    while True:

        message, clientAddress = serverSocket.recvfrom(2048)
        msg = message.decode().split(",")
        print(msg)
        
        operation = msg[1]
        print(operation)
        if '.' in msg[0]:
            num1 = float(msg[0])
        else:
            num1 = int(msg[0])    
        
        if '.' in msg[0]:
            num2 = float(msg[2])
        else:
            num2 = int(msg[2])
        
        if operation == '+':
            result = num1+num2
        elif operation == '-':
            result = num1-num2
        elif operation == 'x':
            result = num1*num2
        elif operation == '/':
            result = num1/num2
        else:
            print("operation error")
        
        serverSocket.sendto(str(result).encode(), clientAddress)


if __name__=="__main__":
    main()

 

client.py

from socket import *
import tkinter
from tkinter import StringVar, ttk

def btn_pressed(result_window, value):
    global operator, temp, result
    
    if value == "AC":
        #* initialize
        operator = ''
        temp = 0
        result = ''
        result_window.delete(0,'end')
        print("All Clear pressed")
    else:
        if result != '':
            # operator = ''
            # temp = 0
            result = ''
            result_window.delete(0,'end')

        result_window.insert("end", value)
        print(value+" is pressed.")

def operator_pressed(result_window, value):

    global operator
    global temp
    
    if (result_window.get() != ''):
        operator = value

        res_value = result_window.get()
        if '.' in res_value:
            temp = float(res_value)
        else:
            temp = int(res_value)
        result_window.delete(0,'end') #* 지우고 나서 다음 입력을 받음
        print("operator func : ",temp,operator)



def equal_button_pressed(result_window, value,serverName, serverPort,clientSocket):
    global operator,temp,result    

    
    print("for equal : ", temp,operator,"?",value)
    
    
    if operator != '' and result_window.get() != '':
        res_value = result_window.get()
        
        if '.' in res_value:
            number = float(res_value)
        else:
            number = int(res_value)

        msg = ""
        msg += str(temp)
        msg += ","
        msg += str(operator)
        msg += ","
        msg += str(number)
        
        clientSocket.sendto(msg.encode(), (serverName, serverPort))
        '''
        if operator == '+':
            result = temp + number
        elif operator == '-':
            result = temp - number
        elif operator == 'x':
            result = temp * number
        elif operator == '/':
            result = temp / number
        else:
            print("operator error!")
        '''

        resultMessage, serverAddress = clientSocket.recvfrom(2048)
        result = resultMessage.decode()
        print("server : ",result)
        result_window.delete(0,'end')
        result_window.insert(0,result)
        print(temp,operator,number,"=",result)
        
        #* initialize
        operator = ''
        temp = 0
        

def main():

    serverName = 'localhost'
    serverPort = 12000
    clientSocket = socket(AF_INET, SOCK_DGRAM)
    
    global operator,temp,result
    operator = ''
    temp = 0
    result = ''
    

    window = tkinter.Tk()

    window.title("Calculator")
    window.geometry("400x200")

    input_value = StringVar(window, value='') # 입력 창


    result_window = ttk.Entry(window,textvariable=input_value ,width=40)
    result_window.grid(row=0, columnspan=4)


    #* button 7~9
    keypad = ttk.Button(window, text="7",command=lambda:btn_pressed(result_window,"7"))
    keypad.grid(row=1, column=0)

    keypad = ttk.Button(window, text="8",command=lambda:btn_pressed(result_window,"8"))
    keypad.grid(row=1, column=1)

    keypad = ttk.Button(window, text="9",command=lambda:btn_pressed(result_window,"9"))
    keypad.grid(row=1, column=2)

    #* mul button
    keypad = ttk.Button(window, text="x",command=lambda:operator_pressed(result_window,"x"))
    keypad.grid(row=1, column=3)

    #* button 4~6
    keypad = ttk.Button(window, text="4",command=lambda:btn_pressed(result_window,"4"))
    keypad.grid(row=2, column=0)

    keypad = ttk.Button(window, text="5",command=lambda:btn_pressed(result_window,"5"))
    keypad.grid(row=2, column=1)

    keypad = ttk.Button(window, text="6",command=lambda:btn_pressed(result_window,"6"))
    keypad.grid(row=2, column=2)

    #* minus button
    keypad = ttk.Button(window, text="-",command=lambda:operator_pressed(result_window,"-"))
    keypad.grid(row=2, column=3)


    #* button 1~3
    keypad = ttk.Button(window, text="1",command=lambda:btn_pressed(result_window,"1"))
    keypad.grid(row=3, column=0)

    keypad = ttk.Button(window, text="2",command=lambda:btn_pressed(result_window,"2"))
    keypad.grid(row=3, column=1)

    keypad = ttk.Button(window, text="3",command=lambda:btn_pressed(result_window,"3"))
    keypad.grid(row=3, column=2)
    
    #* plus button
    keypad = ttk.Button(window, text="+",command=lambda:operator_pressed(result_window,"+"))
    keypad.grid(row=3, column=3)

    

    #* button All clear, 0, divide
    keypad = ttk.Button(window, text="AC",command=lambda:btn_pressed(result_window,"AC"))
    keypad.grid(row=4, column=0)

    keypad = ttk.Button(window, text="0",command=lambda:btn_pressed(result_window,"0"))
    keypad.grid(row=4, column=1)

    keypad = ttk.Button(window, text="/",command=lambda:operator_pressed(result_window,"/"))
    keypad.grid(row=4, column=2)

    #* equal button
    keypad = ttk.Button(window, text="=",command=lambda:equal_button_pressed(result_window,"=",serverName, serverPort,clientSocket))
    keypad.grid(row=4, column=3)


    window.mainloop()
    

if __name__=="__main__":
    main()

'Code' 카테고리의 다른 글

roberts sobel prewit operator  (0) 2022.05.10
python TCP calculator  (0) 2022.05.10
raw to bmp  (0) 2022.03.29
백준 4354  (0) 2022.02.07
백준 1786  (0) 2022.02.07