Difference between revisions of "트킨터"

Jump to navigation Jump to search
1,236 bytes added ,  21:42, 15 July 2021
no edit summary
 
(5 intermediate revisions by 5 users not shown)
Line 2: Line 2:
<div style="float: right; margin-left: 12px">__TOC__</div>
<div style="float: right; margin-left: 12px">__TOC__</div>


= 개요 =
[[트킨터]] ([[Tkinter]]) [[패키지]]는 Tk GUI [[툴킷]]([[toolkit]])에 대한 [[파이썬]]([[Python]])의 표준 인터페이스이다. Tkinter는 Tk interface의 줄임말로 [[트킨터]] 또는 [[티케이인터]]라고 읽는다. ttk나 messagebox같은 [[모듈]]을 모아놓은 것을 Tkinter [[package]]라고 한다.
[[Tkinter]] [[패키지]]는 Tk GUI [[툴킷]]([[toolkit]])에 대한 [[파이썬]]([[Python]])의 표준 인터페이스이다. Tkinter는 Tk interface의 줄임말로 [[트킨터]] 또는 [[티케이인터]]라고 읽는다. ttk나 messagebox같은 [[모듈]]을 모아놓은 것을 Tkinter [[package]]라고 한다.


[[Tk]]는 플랫폼 독립적인 [[GUI]] 라이브러리이다. [[티케이]]는 많은 [[프로그래밍 언어]]에서 [[그래픽 유저 인터페이스]](GUI)를 만들기 위한 GUI [[위젯]](widget)의 기본 요소들의 [[라이브러리]](library)를 제공하는 [[오픈 소스]] [[크로스 플랫폼]] 위젯 툴킷이다.
[[Tk]]는 플랫폼 독립적인 [[GUI]] 라이브러리이다. [[티케이]]는 많은 [[프로그래밍 언어]]에서 [[그래픽 유저 인터페이스]](GUI)를 만들기 위한 GUI [[위젯]](widget)의 기본 요소들의 [[라이브러리]](library)를 제공하는 [[오픈 소스]] [[크로스 플랫폼]] 위젯 툴킷이다.
Line 10: Line 9:


[[Tcl]]과 [[Tk]] GUI 툴킷을 묶어서 Tcl/Tk라고 부른다.
[[Tcl]]과 [[Tk]] GUI 툴킷을 묶어서 Tcl/Tk라고 부른다.
이 [[문서]]의 [[쏠쓰 코드]] ([[source code]])는 [[우분투]] 19.10, [[파이썬]] 3.7.5에서 테스트되었다.




Line 21: Line 24:




[[리눅스 민트]]에는 python3-tk 패키지가 설치되어있지 않으므로 [[터미널]]에서
[[우분투]] 19.10에는 python3-tk 패키지가 설치되어있지 않으므로 [[터미널]] ([[terminal]])에서
  sudo apt-get install python3-tk
  sudo apt install python3-tk
하여 관련 패키지들을 설치해준다.
[[명령어]] ([[command]])를 입력하여 관련 패키지를 설치해준다.


= pack, grid로 부품 배열 =
 
 
[[소스 코드]] [[편집기]]로는 [[VS코디엄]] ([[VSCodium]])이나 적당히 아무거나 쓰면 된다.
 
 
우분투 19.10의 경우
python3 cal.py
와 같은 방식으로 실행시키면 된다.
 
== pack, grid로 부품 배열 ==
박스 띄우기
박스 띄우기


Tk()는 트킨터 객체의 생성자이다. 윈도10기준 프롬프트에서
Tk()는 트킨터 객체의 생성자이다.
  root=Tk()
  root=Tk()
하면 빈 창이 뜬다.
입력하면 빈 창이 뜬다.
 


(Tk객체).mainloop()를 하면 창에서 입력을 받아들인다.
(Tk객체).mainloop()를 하면 창에서 입력을 받아들인다.
root.mainloop()
와 같이 해주면 된다.


from tkinter import *
root=Tk()
  root.mainloop()
  root.mainloop()
와 같이 해주면 된다.
까지 최소 3줄을 [[쏠쓰 코드]] ([[source code]])에 포함해줘야 빈 창이 뜬다.




위젯(widget) 달기
위젯(widget) 달기


  bozy = 위젯명(달아줄 Tk객체, ... )
  pussy = widget_name(new_Tk_object, ... )
  bozy.pack()  
  pussy.pack()  


와 같은 방식으로 달아줄 수 있다. bozy는 임의로 붙인 명칭이다.
와 같은 방식으로 달아줄 수 있다. pussy는 임의로 붙인 명칭이다.




Line 51: Line 70:
  root = Tk()
  root = Tk()
   
   
  sister_bozy = Label(root, text = "예시")
  sister_pussy = Label(root, text = "sis pussy")
  sister_bozy.pack()
  sister_pussy.pack()


sister_bozy는 임의로 붙인 명칭이다. 그러나 = 옆의 Label은 반드시 그대로 써야한다.
sister_pussy는 임의로 붙인 명칭이다. 그러나 "Label"은 반드시 그대로 써야한다.




Line 68: Line 87:




== 레이블 1개, 입력 창 1개, 버튼 2개 ==
 
아래는 grid로 만들어본 상자이다. (기능은 없음)
완성된 [[코드]] ([[code]])는 아래와 같다.


  from tkinter import *
  from tkinter import *
  root = Tk()
  root = Tk()
   
   
  title = Label(root,text="입력")
sister_pussy = Label(root, text = "sis pussy")
sister_pussy.pack()
root.mainloop()
 
 
=== 레이블 1개, 입력 창 1개, 버튼 2개 ===
아래는 grid로 만들어본 상자이다. (기능은 없다.)
 
from tkinter import *
root = Tk()
  title = Label(root,text="Input")
  txtbox = Entry(root, width = 15)
  txtbox = Entry(root, width = 15)
  btn_1= Button(root, text = "전송", width=10)
  btn_1= Button(root, text = "Submit", width=10)
  btn_2 = Button(root, text = "취소", width=10)
  btn_2 = Button(root, text= "Cancel", width=10)
   
   
  title.grid(row=0, column=0)
  title.grid(row=0, column=0)
  txtbox.grid(row=0,column=1)
  txtbox.grid(row=0, column=1)
  btn_1.grid(row=1,column=1)
  btn_1.grid(row=1,column=1)
  btn_2.grid(row=2,column=1)
  btn_2.grid(row=2, column=1)
   
   
  root.mainloop()
  root.mainloop()
Line 95: Line 126:
  btn_2.grid(row=1,column=1)  
  btn_2.grid(row=1,column=1)  


* tkinter 처음하기 http://studioplug.tistory.com/219
* tkinter 처음하기 https://studioplug.tistory.com/219


== 레이블 2개, 입력 창 2개 ==
=== 레이블 2개, 입력 창 2개 ===
Grid라고 하는 geometry manager는 위젯을 2차원의 표에 놓습니다.
Grid라고 하는 geometry manager는 위젯을 2차원의 표에 놓습니다.
마스터위젯은 row와 column에 해당하는 숫자로 나뉘고, 완성된 표에서 각각의 '셀'(표의 한 칸)은 위젯을 잡아둡니다.
마스터위젯은 row와 column에 해당하는 숫자로 나뉘고, 완성된 표에서 각각의 '셀'(표의 한 칸)은 위젯을 잡아둡니다.
Line 148: Line 179:
위와 같이 sticky 옵션을 쓰지 않으면 위젯들이 각각의 셀(cell)에서 가운데 정렬된다. sticky 옵션은 N,S,E,W 중에 하나 이상의 값을 필요로 합니다. 레이블(label)들을 왼쪽정렬하기 위해, sticky=W를 사용합니다. N = north 북족, W = west 서쪽, E = east 동쪽, S = south 남쪽.
위와 같이 sticky 옵션을 쓰지 않으면 위젯들이 각각의 셀(cell)에서 가운데 정렬된다. sticky 옵션은 N,S,E,W 중에 하나 이상의 값을 필요로 합니다. 레이블(label)들을 왼쪽정렬하기 위해, sticky=W를 사용합니다. N = north 북족, W = west 서쪽, E = east 동쪽, S = south 남쪽.


=== 체크 박스와 그림 추가 ===
==== 체크 박스와 그림 추가 ====
  from tkinter import *
  from tkinter import *
  master = Tk()
  master = Tk()
Line 206: Line 237:


자세한 내용은 아래 링크 참조
자세한 내용은 아래 링크 참조
* tkinter grid method http://studioplug.tistory.com/220
* tkinter grid method https://studioplug.tistory.com/220


 
== 체크버튼, 콤보박스 넣기 ==
= 체크버튼, 콤보박스 넣기 =
=== 레이블 안에 이미지 넣기 ===
== 레이블 안에 이미지 넣기 ==
1. Tkinter 위젯
1. Tkinter 위젯


Line 276: Line 306:
     main()
     main()


예제로 배우는 파이썬 프로그래밍 - Tkinter 위젯 http://pythonstudy.xyz/python/article/121-Tkinter-%EC%9C%84%EC%A0%AF
예제로 배우는 파이썬 프로그래밍 - Tkinter 위젯 https://pythonstudy.xyz/python/article/121-Tkinter-%EC%9C%84%EC%A0%AF


== 체크버튼 ==
=== 체크버튼 ===
checkbutton 위젯 체크버튼
checkbutton 위젯 체크버튼


Line 359: Line 389:




== 텍스트박스 ==
=== 텍스트박스 ===
textbox 위젯
textbox 위젯


Line 399: Line 429:




== 콤보박스 ==
=== 콤보박스 ===
combobox 위젯
combobox 위젯


Line 450: Line 480:




== 버튼 클릭시 새 창 띄우기 ==
=== 버튼 클릭시 새 창 띄우기 ===
  from tkinter import *
  from tkinter import *
   
   
Line 520: Line 550:




== 프레임 여러개 만들기 ==
=== 프레임 여러개 만들기 ===
아래 예제는 고객 데이타를 입력 받는 간단한 윈도우 샘플이다. 메인 Frame 안에 4개의 자식 Frame을 사용하였고, 각각의 자식 Frame 안에 레이블, 텍스트, 버튼 등의 위젯들을 추가하였다.
아래 예제는 고객 데이타를 입력 받는 간단한 윈도우 샘플이다. 메인 Frame 안에 4개의 자식 Frame을 사용하였고, 각각의 자식 Frame 안에 레이블, 텍스트, 버튼 등의 위젯들을 추가하였다.


Line 581: Line 611:
     main()
     main()


예제로 배우는 파이썬 프로그래밍 - Tkinter 위젯 http://pythonstudy.xyz/python/article/121-Tkinter-%EC%9C%84%EC%A0%AF
예제로 배우는 파이썬 프로그래밍 - Tkinter 위젯 https://pythonstudy.xyz/python/article/121-Tkinter-%EC%9C%84%EC%A0%AF




== 체크버튼과 입력값으로 if문 만들기 ==
=== 체크버튼과 입력값으로 if문 만들기 ===
  from tkinter import *
  from tkinter import *
  from tkinter import ttk, messagebox
  from tkinter import ttk, messagebox
Line 711: Line 741:




= 객체 지향 프로그래밍(클래스 사용) =
== 객체 지향 프로그래밍(클래스 사용) ==
[[파이썬]]에서는 [[클래스]](class)를 사용하여 [[객체 지향 프로그래밍]](object-oriented programming, OOP)을 할 수 있다.
[[파이썬]]에서는 [[클래스]](class)를 사용하여 [[객체 지향 프로그래밍]](object-oriented programming, OOP)을 할 수 있다.


Line 717: Line 747:
* Python,tkinter 입문 (Python, tkinter 간단히 사용하기 001) https://blog.naver.com/dudwo567890/130166663839
* Python,tkinter 입문 (Python, tkinter 간단히 사용하기 001) https://blog.naver.com/dudwo567890/130166663839


== 아무 것도 없는 창 ==
=== 아무 것도 없는 창 ===
  from tkinter import *
  from tkinter import *
   
   
Line 725: Line 755:
위에서 생성된 최상위창은 tkinter 애플리케이션에서 가장 높은 수준의 GUI구성요소이며, 최상위 창의 이름은 'root'로 하는것이 관례적이다.
위에서 생성된 최상위창은 tkinter 애플리케이션에서 가장 높은 수준의 GUI구성요소이며, 최상위 창의 이름은 'root'로 하는것이 관례적이다.


== packing 하기 ==
=== packing 하기 ===
아래 예제에서 tkinter 프로그래밍의 세가지 주요 개념이 나온다.
아래 예제에서 tkinter 프로그래밍의 세가지 주요 개념이 나온다.


Line 751: Line 781:
즉, 애플리케이션에 보여지도록 설정한다.
즉, 애플리케이션에 보여지도록 설정한다.


== 창 부품(위젯) 꾸리기 ==
=== 창 부품(위젯) 꾸리기 ===
창 가운데 녹색 버튼 띄우기.
창 가운데 녹색 버튼 띄우기.


Line 784: Line 814:
즉, root의 자식은 F이며, F의 자식은 button1이 되는것이다.
즉, root의 자식은 F이며, F의 자식은 button1이 되는것이다.


== 클래스 구조 ==
=== 클래스 구조 ===
왜 애플리케이션을 클래스로 구성하는가?
왜 애플리케이션을 클래스로 구성하는가?


Line 808: Line 838:
  root.mainloop()
  root.mainloop()


=== 중앙에 닫기 버튼이 있는 창 ===
==== 중앙에 닫기 버튼이 있는 창 ====
  import tkinter as tk
  import tkinter as tk
  class Application(tk.Frame):
  class Application(tk.Frame):
Line 824: Line 854:
창이 작게 뜨기 때문에 창 맨 위에 뜨는 제목(title)인 "니 [[애미]] 보지"가 보이지 않는다. 마우스로 창을 키우면 창 이름인 "니 애미 [[보지]]"가 보인다.
창이 작게 뜨기 때문에 창 맨 위에 뜨는 제목(title)인 "니 [[애미]] 보지"가 보이지 않는다. 마우스로 창을 키우면 창 이름인 "니 애미 [[보지]]"가 보인다.


== 속성 설정하기 ==
=== 속성 설정하기 ===
  from tkinter import *
  from tkinter import *
   
   
Line 863: Line 893:
또 한 가지 주목할 점은 버튼을 추가한 순서대로 차곡차곡 쌓이며 보여지는것을 알수 있다.
또 한 가지 주목할 점은 버튼을 추가한 순서대로 차곡차곡 쌓이며 보여지는것을 알수 있다.


== 정렬 ==
=== 정렬 ===
packing은 구성요소의 시각적 관계를 제어하는 방법이다.
packing은 구성요소의 시각적 관계를 제어하는 방법이다.


Line 923: Line 953:
복잡한 GUI를 다루는 방법으로 여러 동선을 사용하고 싶을땐, 그릇안에 그릇을 내포시키는 것이다.
복잡한 GUI를 다루는 방법으로 여러 동선을 사용하고 싶을땐, 그릇안에 그릇을 내포시키는 것이다.


== 사건 묶기 ==
=== 사건 묶기 ===
사건묶기(binding)이란 다음과 같은 객체들 사이의 관계 또는 연결을 정의하는 과정이다.
사건묶기(binding)이란 다음과 같은 객체들 사이의 관계 또는 연결을 정의하는 과정이다.


Line 1,007: Line 1,037:
이런식으로 동작하려면 myapp은 자신의 자손이 누구인지 알아야 한다. 그래서 5행에서 myapp이 그의 부모를 기억하도록 한것이다.
이런식으로 동작하려면 myapp은 자신의 자손이 누구인지 알아야 한다. 그래서 5행에서 myapp이 그의 부모를 기억하도록 한것이다.


== 초점(focus) ==
=== 초점(focus) ===
위의 예제에서는 마우스로 클릭하면 버튼에게 일을 시킬 수 있었다.
위의 예제에서는 마우스로 클릭하면 버튼에게 일을 시킬 수 있었다.


Line 1,111: Line 1,141:
Key 이벤트가 발생한 위젯
Key 이벤트가 발생한 위젯


=== 키보드 입력을 보여주기 ===
==== 키보드 입력을 보여주기 ====
아래 예제는 Key 이벤트에 대해 keyPressed() 함수를 바인딩하고, 전달된 event.char 를 써서 눌려진 키를 프린트하는 코드이다.
아래 예제는 Key 이벤트에 대해 keyPressed() 함수를 바인딩하고, 전달된 event.char 를 써서 눌려진 키를 프린트하는 코드이다.


Line 1,132: Line 1,162:
  root.mainloop()
  root.mainloop()


예제로 배우는 파이썬 프로그래밍 - Tkinter 이벤트 http://pythonstudy.xyz/python/article/122-Tkinter-%EC%9D%B4%EB%B2%A4%ED%8A%B8
예제로 배우는 파이썬 프로그래밍 - Tkinter 이벤트 https://pythonstudy.xyz/python/article/122-Tkinter-%EC%9D%B4%EB%B2%A4%ED%8A%B8


== 명령어 묶기 ==
=== 명령어 묶기 ===
명령어 묶기(Command Binding)
명령어 묶기(Command Binding)


Line 1,199: Line 1,229:
즉, 버튼자체에 명령어를 묶어주는것을 명령어 묶기 라고 할수 있다.
즉, 버튼자체에 명령어를 묶어주는것을 명령어 묶기 라고 할수 있다.


== 사건묶기와 명령어묶기의 차이 ==
=== 사건묶기와 명령어묶기의 차이 ===
바로 위 예제에서는 Tab키를 이용하여 초점을 "OK"버튼창부품에 두고, 스페이스바를 눌러서 버튼색이 바뀌도록 할수는 있지만, 엔터키를 투르면 아무 효과도 없다.
바로 위 예제에서는 Tab키를 이용하여 초점을 "OK"버튼창부품에 두고, 스페이스바를 눌러서 버튼색이 바뀌도록 할수는 있지만, 엔터키를 투르면 아무 효과도 없다.


Line 1,276: Line 1,306:
사건묶기는 원하는 사건에 원하는 사건처리자를 연결하여 창부품에 지정하는것이라고 할수 있다.
사건묶기는 원하는 사건에 원하는 사건처리자를 연결하여 창부품에 지정하는것이라고 할수 있다.


== 정보 공유하기 ==
=== 정보 공유하기 ===
지난 예제들에서는 사건처리자에게 실제로 일을 시키는 방법들을 알아보았다.
지난 예제들에서는 사건처리자에게 실제로 일을 시키는 방법들을 알아보았다.


Line 1,382: Line 1,412:
  print("Complete...")
  print("Complete...")


== 명령어 묶기 더 자세히 ==
=== 명령어 묶기 더 자세히 ===
명령어묶기에 대하여 좀더 고급특징을 알아보도록 하겠다.
명령어묶기에 대하여 좀더 고급특징을 알아보도록 하겠다.


Line 1,451: Line 1,481:
위 예제의 문제의 해결방법을 아래예제를 통해 알아보도록 하겠다.
위 예제의 문제의 해결방법을 아래예제를 통해 알아보도록 하겠다.


== 역호출 함수 ==
=== 역호출 함수 ===
위 예제의 문제점을 살펴보면, 함수가 어플리케이션이 실행되기도 전에 ButtonHandler사건처리자가 실행된다는것이다.
위 예제의 문제점을 살펴보면, 함수가 어플리케이션이 실행되기도 전에 ButtonHandler사건처리자가 실행된다는것이다.


Line 1,565: Line 1,595:
람다(lambda)를 이용하여 인자를 전달함으로써 함수호출이 아닌 함수객체를 전달하였다.
람다(lambda)를 이용하여 인자를 전달함으로써 함수호출이 아닌 함수객체를 전달하였다.


== 함수 내포 기법(currying) ==
=== 함수 내포 기법(currying) ===
앞의 예제에서 인자를 사건처리자(함수)에 건네기 위해 람다를 사용한 방법을 알아보았다.
앞의 예제에서 인자를 사건처리자(함수)에 건네기 위해 람다를 사용한 방법을 알아보았다.


Line 1,578: Line 1,608:
자세한 내용은 아래URL에서 알수 있다.
자세한 내용은 아래URL에서 알수 있다.


http://aspn.activestate.com/ASPN/Python/Cookbook/
https://aspn.activestate.com/ASPN/Python/Cookbook/


http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52549
https://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52549


   
   
Line 1,711: Line 1,741:
자 선택은 사용자의 몫이다. 자기가 사용하기 편하고, 가장 친숙한것을 사용하자. 그리고 작업에 가장 적당하다고 여겨 지는것을 사용하자.
자 선택은 사용자의 몫이다. 자기가 사용하기 편하고, 가장 친숙한것을 사용하자. 그리고 작업에 가장 적당하다고 여겨 지는것을 사용하자.


 
== GUI 계산기 만들기 ==
= GUI 계산기 만들기 =
[[Tkinter]]를 이용한 [[그래피컬 사용자 인터페이스]] ([[GUI]]) 계산기의 [[파이썬]] ([[Python]]) [[쏘쓰 코드]] ([[source code]])이다.
[[트킨터]] ([[Tkinter]])를 이용한 사칙연산 GUI 계산기의 [[파이썬]] ([[Python]]) [[쏘쓰 코드]] ([[source code]])이다.




Line 1,750: Line 1,779:
             # partial takes care of function and argument
             # partial takes care of function and argument
             cmd = partial(self.calculate, b)
             cmd = partial(self.calculate, b)
             tk.Button(self, text=b, width=5, relief=rel,
             tk.Button(self, text=b, width=5, relief=rel, command=cmd).grid(row=r, column=c)
                command=cmd).grid(row=r, column=c)
             c += 1
             c += 1
             if c > 4:
             if c > 4:
Line 1,810: Line 1,838:




== 쏘쓰 코드 설명 ==
http://uoxqi4lrfqztugili7zzgygibs4xstehf5hohtkpyqcoyryweypzkwid.onion/?img=361615491111.png
 
http://hostxvivwx3lzvfdnof2muv7q5fkcovkfa3nexlnl5zrelif2mawxkad.onion/image.php?di=631T
 
 
http://pdogfxf7k6lyqe7uhmrokpc74nk2td75m4al5t6uvfhdvvxvng3nazid.onion\/tnibabrS30.jpg
 
http://3b6clio4syptsnvvtzyxifqvtizyazgyowpp3v5f7dj3mzmfhyoy4iyd.onion/images/8f98719adf96e79c9647c790631c1c2e.png
 
 
=== 쏘쓰 코드 설명 ===
아래 링크는 [[쏘쓰 코드]] ([[source code]]) 출처이다.
아래 링크는 [[쏘쓰 코드]] ([[source code]]) 출처이다.


Line 1,821: Line 1,859:




[[쏘스 코드]]에서 ' 3개로 싸인 부분은 [[주석]] ([[comment]])이다. 자세한 설명은 [[파이썬]] 문서를 참조하라.
[[쏘스 코드]]에서 ' 나 " 3개로 싸인 부분은 [[주석]] ([[comment]])이다. 한 줄의 맨 앞에 #를 써놔도 주석이다. 자세한 설명은 [[파이썬]] 문서를 참조하라.




Line 1,863: Line 1,901:
https://dojang.io/mod/page/view.php?id=522
https://dojang.io/mod/page/view.php?id=522


= 게임 만들기 =
[[파이게임]] 문서 참조.




더 자새한 설명은 [[Tkinter]] 문서 참조.


== 트킨터로 게임 만들기 ==
* [파이썬 게임 프로그래밍 공부] 1. tkinter 모듈 시작하기
* [파이썬 게임 프로그래밍 공부] 1. tkinter 모듈 시작하기
2017-09-01
2017-09-01
Line 1,879: Line 1,917:
https://alegruz.imweb.me/blog/?idx=221692&bmode=view
https://alegruz.imweb.me/blog/?idx=221692&bmode=view


= 함께 보기 =
== 함께 보기 ==
* [[필독 사항]]
* [[필독 사항]]
* [[다크넽]] ([[Darknet]])
* [[다크넽]] ([[Darknet]])
5

edits

Navigation menu