Chapter 10. GUI 프로그래밍 기초

이성욱·2024년 6월 3일

turtle 모듈을 이용한 그래픽

turtle 모듈이란

Turtle 모듈은 파이썬에 내장된 모듈로 간단한 그래픽(선, 점, 곡선 등)을 그릴 수 있는 그래픽 프로그램이다.

Turtle 모듈의 기본 명령어

  • import turtle: turtle 모듈을 불러옴
    : 보통 import turtle as t 방식으로 변형하여 사용
  • setup(width=크기, height=크기): turtle 그래픽 영역 크기 설정
  • shape(모양): 커서 모양을 변경: turtle, circle, arrow, classic
  • color(색): 커서의 색을 변경
  • bgcolor(색): 배경색을 변경
  • pensize(두께): 선의 두께를 변경: 숫자
  • goto(x좌표, y좌표): 커서(거북이)의 위치 지정

pen의 위치 설정

  • penup(): 펜을 들어 올림, 들어올린 상태에서는 그림이 안 그려진다.
  • pendown(): 펜을 내림, 이동하면 그림이 그려진다.

그림 그리기

  • forward(이동칸수): 거북이 머리 방향으로 이동칸 수 만큼 이동
  • backward(이동칸수): 거북이 꼬리 방향으로 이동칸 수 만큼 이동
  • right(각도): 거북이가 각도 만큼 오른쪽으로 전환
  • left(각도): 거북이가 각도 만큼 왼쪽으로 전환
  • home(): 거북이가 0,0으로 이동
  • circle(반지름): 반지름의 원을 그린다
  • undo(): 이전에 했던 행동 취소
  • speed(속도): 거북이의 속도 조절

GUI 프로그래밍의 시작

tkinter 모듈

tkinter는 파이썬에서 그래픽 사용자 인터페이스(GUI: graphical user interface)를 개발할 때 필요한 모듈

tkinter 모듈의 유래

tkinter는 예전부터 유닉스 계열에서 사용되던 Tcl/Tk 위에 객체 지향 계층을 입힌 것이다. Tk는 John Ousterhout에 의하여 Tcl 스크립팅 언어를 위한 GUI 확장으로 개발

tkinter 모듈의 구성

  • 컨테이너: 위젯을 포함하고 표시할 수 있는 곳
  • 위젯(Widget): 창을 구성하는 요소
    • GUI에서 컴퓨터와 사용자가 상호 작용을 하는 인터페이스 요소
    • 버튼, 문자, 체크박스, 라디오 버튼 등등

tkinter의 위젯들

  • Button
  • Canvas
  • Checkbutton
  • Entry
  • Frame
  • Label
  • Listbox
  • Menu
  • Menubutton
  • Message
  • Radiobutton
  • Scale
  • Scrollbar
  • Text
  • Toplevel
  • LabelFrame
  • PanedWindow
  • Spinbox

GUI 프로그래밍의 시작

  • import tkinter
  • tkinter 모듈의 Tk() 호출: tkinter.Tl()
  • tkinter 내의 모든 함수를 tkinter 없이 사용하는 방법
    • from 사용
  • tkinter 없이 Tk() 호출 후 반환값을 저장
    : Tk()로 생성되는 컨테이너 값을 저장

  • mainloop(): 이벤트를 기다리는 무한 루프 함수(Root Window, Base Window)

  • title(문자열): 컨테이너의 이름 결정

  • geometry(문자열): 컨테이너의 초기 크기 결정

    • Geometry("400x100")
  • Resizable(): 컨테이너 크기 조절 가능 여부 설정

Label, Button 위젯과 pack() 배치 관리자

  • Label 위젯: 글씨를 쓰거나 그림을 불러올 수 있는 위젯
    • Label(컨테이너, text=표시할 문자열)
  • Button 위젯: 클릭이 가능한 버튼 위젯
    • Button(컨테이너, text=표시할 문자열, 이벤트 처리)
  • pack(): 배치 관리자중 하나로 차곡차곡 쌓는 방식의 배치

GUI 프로그램의 동작방식 및 완성

GUI 프로그래밍의 동작방식: 이벤트 처리 소개

  • tkinter 프로그램은 이벤트에 기반을 두고 동작된다.
  • 이벤트(event): 사용자나 프로그램에 의한 행위. 무엇인가가 일어났음을 의미하는 소프트웨어적인 메시지

배치관리자와 몇 가지 위젯



GUI

import turtle

turtle.shape("turtle")
turtle.color("red")
turtle.forward(100)

##########################################################

import turtle as t # turtle을 t라고 부른다.

t.shape("turtle")
t.color("red")
t.pensize(3)
t.forward(100)
t.left(90)
t.forward(100)
t.right(45)
t.forward(50)
t.goto(200,-200)
t.color("blue")
t.home()
t.circle(100)

######################################################

import turtle

t=turtle.Turtle()

t.shape("turtle")
t.forward(100)


#################################################

## 예제 1

import turtle as t

t.shape("turtle")
t.forward(100)
t.right(66)
t.forward(100)
t.penup()
t.forward(100)
t.pendown()
t.left(150)
t.forward(200) 	

## 예제 2

import turtle
t=turtle.Turtle()

colors = ["red", "purple", "blue", "green", "yellow", "orange" ]
t.shape("turtle")
t.speed(0)
t.pensize(3)
length = 10	
while length < 500:	
    t.forward(length)			
    t.pencolor(colors[length%6])	
    t.right (89)			
    length += 5


###########################################################

# 1
import tkinter as t

#########################################################

# 2
from tkinter import *
# from random import * -> random.randint로 안쓰고 randint만 써도 괜찮아 진다.

win = Tk()
win.title("연습용 GUI 프로그램")
win.geometry("400x100")
win.resizable(width=False, height=False) # 창의 크기 변경 불가

win.mainloop()


#########################################################

from tkinter import *

def abcd():
    print("버튼1 클릭")

def efgh():
    print("버튼2 클릭")

win = Tk()
win.title("연습용 GUI 프로그램")
win.geometry("400x100")

l1 = Label(win,text="Hello World")
l1.pack()
b1 = Button(win,text="First Button",command=abcd)
b1.pack()
b2 = Button(win,text="Second Button",command=efgh) # shell 에서 print가 됨
b2.pack()
l2 = Label(win,text="안녕하세요")
l2.pack()


win.mainloop()


#########################################################


from tkinter import *

def abcd():
    print("버튼1 클릭")
    l1.configure(text="버튼1 클릭")
    b1.configure(text="첫번째 버튼")
    b2.configure(text="두번째 버튼")

def efgh():
    print("버튼2 클릭")
    l1.configure(text="버튼2 클릭")
    b1.configure(text="First Button")
    b2.configure(text="Second Button",fg="red",bg="black")

win = Tk()
win.title("연습용 GUI 프로그램")
win.geometry("400x100")

l1 = Label(win,text="Hello World",font=("굴림체",20,"bold"))
l1.pack()
b1 = Button(win,text="First Button",command=abcd)
b1.pack()
b2 = Button(win,text="Second Button",command=efgh) # shell 에서 print가 됨
b2.pack()
l2 = Label(win,text="안녕하세요")
l2.pack()


win.mainloop()

10ex1

from tkinter import *

def i():
    n = 1
    for x in range(1,21):
        n *= x
    l1.configure(text=f"1~20까지의 곱 = {n}")

win = Tk()
win.geometry("400x100")

l1 = Label(win,text="1~20까지의 곱")
l1.pack()
b1 = Button(win,text="시작",command=i)
b1.pack()


win.mainloop()

10ex2

from tkinter import *

def increase():
    global num
    num += 1
    l1.configure(text=f"1~{num}까지의 곱")


def decrease():
    global num
    if num > 2:
        num -= 1
    else:
        print("오류")
    l1.configure(text=f"1~{num}까지의 곱")

def start():
    n = 1
    for x in range(1,num+1):
        n *= x
    l1.configure(text=f"1~{num}까지의 곱 = {n}")

num = 2



win = Tk()
win.geometry("400x100")

l1 = Label(win,text="1~2까지의 곱")
l1.pack()
b1 = Button(win,text="증가",command=increase)
b1.pack(side="left")
b2 = Button(win,text="감소",command=decrease)
b2.pack(side=LEFT)
b3 = Button(win,text="시작",command=start)
b3.pack(side=LEFT)

win.mainloop()

10ex3

from tkinter import *

def increase():
    global n
    n += 1
    l1.configure(text=f"{n}")

def decrease():
    global n
    n -= 1
    l1.configure(text=f"{n}")

n = 0


win = Tk()
win.geometry("400x100")

l1 = Label(win, text="0")
l1.pack()
b1 = Button(win, text="증가",command=increase)
b1.pack(side="left")
b2 = Button(win, text="감소",command=decrease)
b2.pack(side=LEFT)

win.mainloop()

0개의 댓글