* 이 글은 필자가 자신이 배운 내용을 정리하기 위한 것이며, 결코 Udemy 강의를 결제하지 않은 타인의 학습을 고려하여 작성되지 않았습니다.
* 이 글을 학습에 활용하기를 원하신다면, Udemy에서 '[한글자막] Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복' 강의를 구매하시는 것을 권장드립니다.
GUI란, Graphical User Interface의 약자이다. 구이라고도 읽고 지유아이라고도 읽는다.
27일차의 첫 강의(강의 소개를 제외한)는 GUI의 역사를 소개하는 것으로 시작한다. 몰라도 되는 이야기라고 생각해 블로그에 따로 기술하지는 않겠다.
TKinter(티케이인터라고 읽는다)은 python의 내장 모듈로, turtle보다 더 많은 일을 수행할 수 있게 돕는다.
TKinter에서는 turtle처럼 스크린(TKinter에서는 window이다)을 만드는 과정이 있다.
import tkinter
window = tkinter.Tk()
이 코드만 입력하고 프로그램을 실행하면 아무런 일도 일어나지 않는다. 프로그램이 어? 뭐야 할 게 없네? 그러면 전 이만 갑니다 ㅂㅂ 하고 바로 꺼져버리기 때문이다.
그러한 현상을 막기 위해서는
import tkinter
window = tkinter.Tk()
#프로그램 동작 관련 코드
window.mainloop()
와 같이 코드를 작성해야 한다. 여기서 주의해야할 점은, mainloop()는 코드의 맨 마지막에 위치해있어야 한다.
이 외에도 turtle의 Screen처럼 다룰 수 있는 것이 몇가지 있는데, 아래에 간략하게 소개하겠다. (따로 코드블럭을 만들지는 않았다. 또한, window라는 변수명은 임의로 정한 것으로 얼마든지 변경해도 좋다.)
window.title() : 괄호 안에 있는 내용을 창의 맨 위, 제목란에 적는다. (실제로 어떻게 적용되는지 보고 싶다면 직접 코드를 실행해보는 것을 추천한다!)
window.minsize() : width값과 height값을 넣어 프로그램이 뜨는 스크린 창의 크기를 지정한다. (키워드 인자 사용 추천)
(임의의 변수명) = tkinter.Label() : text값을 넣어 레이블을 만들 수 있다. 위치를 지정하지 않으면 보이지 않음에 주의한다. font 인자를 이용하면 크기나 폰트, 이텔릭체로 할건지 볼드체로 할건지 등을 지정할 수 있다.
(임의의 변수명).pack() : 해당 요소(강의에서는 컴포넌트component라고 칭한다.)의 위치를 가운데로 만든다. (가로 기준 가운데이지 세로 기준 가운데가 아니다.)
tkinter 관련된 다양한 함수는 아래 링크에서 확인할 수 있다. (강의에서는 tk commands 사이트를 쓴다.)
Graphical User Interfaces with Tk
Tk/Tcl has long been an integral part of Python. It provides a robust and platform independent windowing toolkit, that is available to Python programmers using the tkinter package, and its extensio...
docs.python.org
Tk Commands, version 8.6.16
www.tcl.tk
링크를 걸어놓았으니 이 외의 다양한 기능을 원하는 사람은 참고하길 바란다.
전에 section 8 | 파라미터 https://iamthevest.tistory.com/14 글에서 인자에 대해 설명한 적이 있다.
이번 강의에서는 그보다 더 심화된 개념인, 고급 인자Advanced Arguments를 다룬다.
section 8에서는 키워드 인자와 순서 인자를 다루었다. 그런데 만약, 열에 아홉은 같은 인자를 사용할 것이라면, 인자에 기본값을 부여하고 필요할 때에만 정정하는 것이 더 편리하지 않을까?
그럴 때 사용할 수 있는 것이 기본값 설정이다.
def say_hello(name, greeting1, greeting2) :
print(f"{name}, {greeting1}. {greeting2}!")
say_hello("Angela", "Hello", "Nice to meet you")
say_hello("James", "Hello", "Nice to meet you")
say_hello("Juan", "Hello", "Nice to meet you")
이런 식의 코드를 작성한다고 하자. 그런데 당신은 가끔은 Hello가 아닌 Hi를 사용하여 인사하고 싶을 때가 있고, Nice to meet you 대신 How are you today를 쓰고 싶을 때가 있을 것이다.
하지만 일반적으로는 Hello와 Nice to meet you를 쓰고 싶다. 그럴 때 당신이 사용할 수 있는 것이 인자 기본값 설정이다.
def say_hello(name, greeting1 = "Hello", greeting2 = "Nice to meet you") :
print(f"{name}, {greeting1}. {greeting2}!")
say_hello("Angela")
say_hello("James")
say_hello("Juan")
이런 간단한 조치만으로도 코드가 무척이나 간단해졌다! 만약 James에게는 Hi라고, Juan에게는 Marry Christmas라고 말하고 말하고 싶다면
def say_hello(name, greeting1 = "Hello", greeting2 = "Nice to meet you") :
print(f"{name}, {greeting1}. {greeting2}!")
say_hello("Angela")
say_hello("James", greeting1 = "Hi")
say_hello("Juan", greeting2 = "Marry Christmas")
와 같이 사용할 수 있다.
위와 같은 상황에서 기본값이 있는 인자에 새로운 값을 넣고 싶다면 키워드 인자를 사용하는 편이 좋지만, 부득이하게 위치 인자를 사용해야 할 때가 있을 것이다. 그런 순간을 위해 참고용으로 가볍게 적어볼 내용이 있다.
def say_hello(name, greeting1 = "Hello", greeting2 = "Nice to meet you") :
print(f"{name}, {greeting1}. {greeting2}!")
say_hello("James", "Hi")
와 같이 '필수' 인자가 아닌 다른 인자가 함수에 포함되어 있을 경우, 앞에 있는 기본값 인자부터 차례대로 대체된다. 바로 위 코드에서는 greeting1 자리가 "Hi"로 대체될 것이다.
아스테리스크는 파이썬에서 꼭 필요한 기능이라고 강의에서 말한다. 난 지금까지 아스테리스크 없이 잘 코딩해왔는데도.
아스테리스크는 개발자들 사이에서 관습적으로 *args라고 표기되며, 이는 arguments의 약자이다. 함수에 아스테리스크가 있다면, 이는 함수가 인자 개수 제한을 두지 않는다는 것을 의미한다.
사용자 정의 함수를 처음 접할 때 많이들 이 코드를 보았을 것이라고 생각한다.
def add(n1, n2):
return n1 + n2
정말이지 간단하기 짝이 없는 코드지만, 인자가 두 개일 때만 작동한다는 큰 오류가 있다. 만약 두 숫자에 대한 덧셈 연산 계산만이 가능한 계산기가 있다면 하루 뒤 쓰레기통에 처박힐 게 분명했다.
그 대신 코드를 이렇게 수정할 수 있다.
def add(*args):
return sum(args)
printing = add(3, 6, 6, 3)
print(printing)
튜플 형태로 들어오는 인자들의 합을 '튜플의 길이와 상관 없이' 출력한다. 이정도는 돼야 최소한의 쓸모를 갖춘 계산기가 될 수 있다.
**kwargs를 사용한다면 이보다 심화적인 작업이 가능한데, *args는 위치 인자를 튜플로 바꾼다면 **kwargs는 키워드 인자를 딕셔너리로 바꾼다. 함수의 괄호 안에 '매개변수 = 인자'와 같은 형태로 키워드 인자를 넣으면 매개변수를 key로, 인자를 value로 갖는 딕셔너리의 한 요소가 생긴다.
kwargs를 사용할 때 예상할 수 있는 오류는 바로 "있어야 할 인자가 없을 때"이다. 만약 나는 make이라는 key가 들어올 것이라고 생각하고 코드를 작성했는데 사용자가 그 사실을 모르고 넣지 않는다면 KeyError가 발생할 것이다.
이 현상을 해결하는 방법은 생각보다 간단하다. 우리가 사용했던 dic["key"]라는 구문 대신에 dic.get("key")를 사용하면 된다. 전자는 해당 key가 없을 경우 KeyError을 발생시키지만 후자는 해당 key가 없을 경우 없구나! ㅇㅋ 하고 그 자리에 None을 넣은 후 넘어간다. 쿨한 친구다.
참고로 아스테리스크를 사용하면서 다른 위치 인자나 키워드 인자를 복합적으로 사용하기를 원한다면, 아스테리스크를 함수의 괄호 맨 뒤에 넣어야한다. def func(a, *args)처럼 하는 것은 괜찮지만, def func(*arg, a)처럼 하면 오류가 발생한다.
아스테리스크는 자기 차례에 남은 모든 인자를 빨아들여 하나의 튜플 혹은 딕셔너리로 만든다. 그러니 앞에서 아스테리스크를 사용하면 뒤에 있는 매개변수가 본인 몫의 인자를 받지 못하게 된다. 이에 유의하여 사용하도록 하자.
TKinter 모듈에는 내가 앞서 서술한 것 외에도 여러 클래스와 메서드가 있지만, 이를 일일이 서술하는 것은 블로그 취지에 맞지 않는 듯하여 (절대 쓰는 게 귀찮아서는 아니다) 넘기도록 하겠다. 추가적인 정보를 얻고 싶은 사람을 위해 python doc 링크도 걸어놨으니까 필요한 사람은 참고하길 바란다.
무엇보다 나는 글 맨 앞에 기술해놨다. 이 강의를 듣지 않는 다른 사람의 학습을 고려하여 작성되지 않았다고. 이 블로그는 어디까지나 내가 내용 정리용으로 쓰는 것이고, 이게 나와 같은 강의를 듣는 다른 사람에게도 도움이 될 수 있을까 하여 올리는 것이다. 그러므로 그렇게까지 친절한 건 아무리 생각해도 과한 게 맞다.
사족이 길었다. 이번 글은 여기까지. 다들 안녕!