5
edits
(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: | ||
[[ | [[우분투]] 19.10에는 python3-tk 패키지가 설치되어있지 않으므로 [[터미널]] ([[terminal]])에서 | ||
sudo apt | sudo apt install python3-tk | ||
[[명령어]] ([[command]])를 입력하여 관련 패키지를 설치해준다. | |||
= pack, grid로 부품 배열 = | |||
[[소스 코드]] [[편집기]]로는 [[VS코디엄]] ([[VSCodium]])이나 적당히 아무거나 쓰면 된다. | |||
우분투 19.10의 경우 | |||
python3 cal.py | |||
와 같은 방식으로 실행시키면 된다. | |||
== pack, grid로 부품 배열 == | |||
박스 띄우기 | 박스 띄우기 | ||
Tk()는 트킨터 객체의 생성자이다. | 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) 달기 | ||
pussy = widget_name(new_Tk_object, ... ) | |||
pussy.pack() | |||
와 같은 방식으로 달아줄 수 있다. | 와 같은 방식으로 달아줄 수 있다. pussy는 임의로 붙인 명칭이다. | ||
Line 51: | Line 70: | ||
root = Tk() | root = Tk() | ||
sister_pussy = Label(root, text = "sis pussy") | |||
sister_pussy.pack() | |||
sister_pussy는 임의로 붙인 명칭이다. 그러나 "Label"은 반드시 그대로 써야한다. | |||
Line 68: | Line 87: | ||
완성된 [[코드]] ([[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 = " | btn_1= Button(root, text = "Submit", width=10) | ||
btn_2 = Button(root, text = " | 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 처음하기 | * 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 | * tkinter grid method https://studioplug.tistory.com/220 | ||
== 체크버튼, 콤보박스 넣기 == | |||
= 체크버튼, 콤보박스 넣기 = | === 레이블 안에 이미지 넣기 === | ||
== 레이블 안에 이미지 넣기 == | |||
1. Tkinter 위젯 | 1. Tkinter 위젯 | ||
Line 276: | Line 306: | ||
main() | main() | ||
예제로 배우는 파이썬 프로그래밍 - Tkinter 위젯 | 예제로 배우는 파이썬 프로그래밍 - 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 위젯 | 예제로 배우는 파이썬 프로그래밍 - 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 이벤트 | 예제로 배우는 파이썬 프로그래밍 - 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에서 알수 있다. | ||
https://aspn.activestate.com/ASPN/Python/Cookbook/ | |||
https://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52549 | |||
Line 1,711: | Line 1,741: | ||
자 선택은 사용자의 몫이다. 자기가 사용하기 편하고, 가장 친숙한것을 사용하자. 그리고 작업에 가장 적당하다고 여겨 지는것을 사용하자. | 자 선택은 사용자의 몫이다. 자기가 사용하기 편하고, 가장 친숙한것을 사용하자. 그리고 작업에 가장 적당하다고 여겨 지는것을 사용하자. | ||
== GUI 계산기 만들기 == | |||
= GUI 계산기 만들기 = | [[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) | ||
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]]) |
edits