물먹는산세베리아

파이썬 tkinter를 이용해 gui 계산기 만들기(비트연산, 진법 변환) 본문

Language/Python

파이썬 tkinter를 이용해 gui 계산기 만들기(비트연산, 진법 변환)

suntall 2020. 9. 8. 06:01

1. tkinter

가장 많이 사용되는 GUI 모듈 중 하나인 tkinter을 사용하였다. 먼저, tkinter 모듈을 포함시켰고, 그 안에 있는 Tk 클래스의 객체를 생성하여 하나의 윈도우가 생성되도록 하였다. 윈도우의 이름은 '계산기'라고 정했다.

 

2. click 함수 (버튼을 눌렀을 때 결과 나타내기)

click 함수

가장 중심이 되는 건 eval(entr.get())이다. entry에서 가져온 문자열 내용대로 계산되는 부분이다. 따라서 사칙연산은 이 식만 있어도 쉽게 결과값이 나온다. key 값으로 '='을 입력 받으면 이때까지 받은 숫자와 연산자들도 계산하여 result에 넣어준다. 그리고 기존에 출력된 값을들 지운뒤 그 위에 result 값을 문자열로 바꾸어 새로 출력시킨다.

=를 누르기 전 숫자와 연산자들은 else: entry.insert(END,key)에서 윈도우에 출력된다. 숫자, 연산자 뿐만 아니라 알바벳 버튼을 누르면 알파벳이 그대로 출력된다. (A,B,C,D,E,F 버튼이 있었으나 원하는 대로 코드를 수정하지 못해 지움)

진법 변환을 위한 경우의 수들을 하나씩 if문으로 작성해 주었다. eval(entry.get())으로 도출해낸 값을 원하는 진법으로 변환하여 result에 넣어준다.

예를 들어 hex()을 활용하여 변환시켜주어도 되지만 이럴 경우 앞에 0x가 붙는다. 그래서 format( , 'h') 형식을 썼다.

[c]는 위 코드대로 지금까지 작성한 것들을 지워주는 역할을 한다.

 

3. 버튼 생성

 

이 코드에서는 버튼을 생성할 때 하나씩 만들어 주지 않고 배열에 작성한 뒤 반복문을 활용하였다. 버튼은 위와 같이 구성되어 있고, hex, dec, oct, bin을 누르면 해당하는 진수로 바뀌고, 비트 연산자 또한 누르면 계산이 된다.

먼저 lambda를 활용하였다. b를 x에 받아 click 함수에 넣어준 return 값을 cmd에 또 넣어준다.  command로 cmd를 호출하고 ridge(버튼효과)를 준 버튼이 생성된다. 버튼에는 반복문 안에서 b에 해당하는 문자가 들어간다. (A를 10으로 수정하는 게 의미 없었던 이유) grid 메소드를 사용하여 테이블 형태로 배치하였고, 입력값과 결과값이 출력될 빈칸도 만들었다.

 

 

 

# 보완할 부분

1) 한번 진법을 바꾸면 다음에 인식할 때는 무조건 10진수로 인식한다. insert할 때 str로 변형하여 입력해서 문제가 되는 부분이다. 그래서 str을 벗기고 계산했는데  entry.insert()는 문자를 받기로 정해져 있기 때문에 원하는 결과가 나오지 않았다. 이전에 몇진법으로 변환하였는지에 따라 다음 계산고 거기에 맞춰 계산을 해야하는데 이를 좀 더 보완해야 할 것 같다.

2) 16진법의 경우 E까지도 15로 계산되는데 여기서 쓴 코드는 문자를 받고 =을 입력하면 오류가 출력된다. 알파벳을 숫자로 인식하지 않기 때문에 예외 처리가 되는 것이다. 여러가지 시도를 해 보았는데 A를 입력하더라도 출력될 때는 10이라도 출력되는 경우는 있었지만 근본적으로 check 함수는 10진수 중심이고  문자를 숫자로 인식하지 않았기 때문에 16진수로 계산할 때 쓸 함수를 따로 적는 식으로 보완해야 할 것 같다.