language:python:tk
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| language:python:tk [2018/02/18 17:08] – [Packer] kieuns | language:python:tk [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| + | |||
| + | < | ||
| + | |||
| + | ====== 시작 ====== | ||
| + | |||
| + | 레퍼런스 - 시작 | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | 그외 | ||
| + | |||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | tkinter의 낡은 모양새가 싫은 경우 써볼만한 다른 GUI lib | ||
| + | |||
| + | * [[https:// | ||
| + | * kivy : https:// | ||
| + | |||
| + | ===== 모듈 import ===== | ||
| + | |||
| + | * import 할 패키지 : tkinter, tkinter.tix, | ||
| + | |||
| + | <code python> | ||
| + | import tkinter | ||
| + | # or | ||
| + | from tkinter import * | ||
| + | </ | ||
| + | |||
| + | ===== 이외의 추가 모듈 ===== | ||
| + | |||
| + | | tkinter.scrolledtext | ||
| + | | tkinter.colorchooser | ||
| + | | tkinter.commondialog | ||
| + | | tkinter.filedialog | ||
| + | | tkinter.font | ||
| + | | tkinter.messagebox | ||
| + | | tkinter.simpledialog | ||
| + | | tkinter.dnd | ||
| + | | turtle | ||
| + | |||
| + | |||
| + | ====== 최소 앱 ====== | ||
| + | |||
| + | <code python> | ||
| + | # | ||
| + | import tkinter as tk | ||
| + | import tkinter.messagebox as mbx | ||
| + | |||
| + | class CApp(tk.Frame) : | ||
| + | def __init__(self, | ||
| + | super().__init__(master) | ||
| + | self.pack() | ||
| + | self.create_widgets() | ||
| + | |||
| + | def create_widgets(self): | ||
| + | self.quitBtn = tk.Button(self, | ||
| + | self.quitBtn.pack(side=' | ||
| + | def sayHi(self): | ||
| + | mbx.showinfo(" | ||
| + | |||
| + | root = tk.Tk( ) | ||
| + | root.title(' | ||
| + | app = CApp(master=root) | ||
| + | app.mainloop() | ||
| + | </ | ||
| + | |||
| + | ===== Window Geometry(지오메트리) ===== | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | Tk 에서는 윈도우의 크기와 위치정보를 지오메트리(Geometry)라고 부르고, 아래 형식으로 입력한다. | ||
| + | |||
| + | <color green> | ||
| + | |||
| + | * width, | ||
| + | * ±x, ±y : x의 경우 +면 왼쪽 화면 몇 픽셀 이동한 위치, -면 오른쪽 화면 끝에서 몇픽셀 이동한 위치. | ||
| + | |||
| + | <code python> | ||
| + | #위의 코드에 조금 덧붙여서 | ||
| + | root = tk.Tk( ) | ||
| + | root.geometry(' | ||
| + | app = CApp(master=root) | ||
| + | app.mainloop() | ||
| + | </ | ||
| + | |||
| + | ==== Resize ==== | ||
| + | |||
| + | <code python> | ||
| + | window.resizable(FALSE, | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | window.minsize(200, | ||
| + | window.maxsize(500, | ||
| + | </ | ||
| + | |||
| + | ==== Get WidgetSize ==== | ||
| + | |||
| + | 위젯을 사이즈를 얻고 싶은데, 화면에 반영되지 않아 결과가 <color / | ||
| + | |||
| + | <code python> | ||
| + | 위젯.update_idletasks() | ||
| + | # or | ||
| + | 위젯.update() | ||
| + | </ | ||
| + | |||
| + | 화면 갱신이 필요한데 아직 안되었을때 , 쓰면 될듯. 이런거 윈도우에도 있었던 것 같은데.. | ||
| + | |||
| + | ===== Anchor ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Packer ===== | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | 위젯이 있을 위치를 정해서 배치하는 것. pack() 함수를 실행하면 옵션에 따라 위젯을 배치한다. | ||
| + | |||
| + | <code python> | ||
| + | some_widget.pack() # default 는 ' | ||
| + | some_widget.pack(side=' | ||
| + | some_widget.pack(expand=1) | ||
| + | </ | ||
| + | |||
| + | pack()을 호출해주면, | ||
| + | |||
| + | ==== Packer 옵션 ==== | ||
| + | |||
| + | | anchor | ||
| + | | exapand | ||
| + | | fill | <color / | ||
| + | | ipadx, ipady | 슬레이브위젯의 내부 패딩을 설정 | ||
| + | | padx, pady | 슬레이브위젯 외부의 패딩값을 설정 | ||
| + | | side | 값은 <color / | ||
| + | |||
| + | <code python> | ||
| + | import tkinter as tk | ||
| + | root = tk.Tk() | ||
| + | |||
| + | # 테스트용 Frame()을 만들고 구분하기 위해 레드로 설정 | ||
| + | frame = tk.Frame(root) | ||
| + | frame[' | ||
| + | |||
| + | # pack()을 써보자, 샘플 전부 | ||
| + | # frame.pack(fill=' | ||
| + | |||
| + | # 테스트1 | ||
| + | frame.pack(fill=' | ||
| + | # 테스트2 | ||
| + | frame.pack(fill=' | ||
| + | |||
| + | # 새로운 위젯 추가 구분하기 위해 블루 설정 | ||
| + | frame2 = tk.Frame(root) | ||
| + | frame2[' | ||
| + | |||
| + | # 두번째 위젯을 추가해서 배열하면 어떻게 나오나? | ||
| + | |||
| + | # 실패: 이렇게 배열하면 두번째꺼 안보임, 두번째거가 살짝 한줄만 | ||
| + | frame.pack(fill=' | ||
| + | frame2.pack() | ||
| + | |||
| + | # 실패: 이렇게 해도 두번째꺼 안보임 | ||
| + | frame.pack(fill=' | ||
| + | frame2.pack(fill=' | ||
| + | |||
| + | # 성공: 이렇게 하니 위에서 아래로 배열 | ||
| + | frame.pack(fill=' | ||
| + | frame2.pack(fill=' | ||
| + | |||
| + | # 실패: 좌->우 방향이 되려면. 두번째꺼가 안보임 | ||
| + | frame.pack(fill=' | ||
| + | frame2.pack(fill=' | ||
| + | |||
| + | # 성공: 좌->우 방향이 되려면. 두번째꺼가 안보임 | ||
| + | frame.pack(fill=' | ||
| + | frame2.pack(fill=' | ||
| + | |||
| + | # | ||
| + | root.title(' | ||
| + | root.geometry(' | ||
| + | root.mainloop() | ||
| + | </ | ||
| + | |||
| + | 이것처럼 만들어보기. | ||
| + | |||
| + | |< 100% >| | ||
| + | | {{: | ||
| + | f1 = tk.Frame(root) | ||
| + | f1[' | ||
| + | f2 = tk.Frame(root) | ||
| + | f2[' | ||
| + | f21 = tk.Frame(f2) | ||
| + | f21[' | ||
| + | f22 = tk.Frame(f2) | ||
| + | f22[' | ||
| + | |||
| + | f1.pack(fill=' | ||
| + | f2.pack(fill=' | ||
| + | f21.pack(fill=' | ||
| + | f22.pack(fill=' | ||
| + | </ | ||
| + | |||
| + | ==== Pack으로 Frame 안쪽을 정 가운데 정렬하기 ==== | ||
| + | |||
| + | <color / | ||
| + | |||
| + | <code python> | ||
| + | 대상오브젝트.pack(fill=" | ||
| + | </ | ||
| + | ===== Grid ===== | ||
| + | |||
| + | 화면 분할. [[http:// | ||
| + | |||
| + | 좀 더 도움이 되는 문서 [[http:// | ||
| + | |||
| + | 사용되기 전에, 어떻게 분할 것인지 미리 정의해두면 거기에 맞게 배열된다. | ||
| + | |||
| + | 초기화를 따로 하진 않고, grid() 함수가 쓰일때마다 최대 값을 알아서 설정하는 듯하다. | ||
| + | |||
| + | ==== 샘플1 ==== | ||
| + | |||
| + | 윈도우 크기만큼 자식 위젯이 늘어나는 grid 배열 예 | ||
| + | |||
| + | |< 100% >| | ||
| + | | {{: | ||
| + | import tkinter as tk | ||
| + | import random | ||
| + | |||
| + | root = tk.Tk() | ||
| + | |||
| + | def get_rand_color(): | ||
| + | de=(" | ||
| + | re=(" | ||
| + | we=(" | ||
| + | color="#" | ||
| + | return color | ||
| + | |||
| + | def grid_test3(): | ||
| + | for r in range(3): | ||
| + | if r != 1: | ||
| + | root.grid_rowconfigure(r, | ||
| + | for c in range(4): | ||
| + | if r == 0: | ||
| + | root.grid_columnconfigure(c, | ||
| + | tv = tk.Label(root, | ||
| + | tv[' | ||
| + | gd = tv.grid(row=r, | ||
| + | |||
| + | root.title(' | ||
| + | root.geometry(' | ||
| + | grid_test3() | ||
| + | root.mainloop() | ||
| + | </ | ||
| + | |||
| + | ==== 샘플2 ==== | ||
| + | |||
| + | <code python> | ||
| + | xx.grid(column=0, | ||
| + | xx.grid(column=3, | ||
| + | # row 쪽은 rowspan 을 사용해서 가로지르기를 구현한다. | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <code python> | ||
| + | from tkinter import * | ||
| + | from tkinter import ttk | ||
| + | |||
| + | root = Tk() | ||
| + | |||
| + | content = ttk.Frame(root) | ||
| + | frame = ttk.Frame(content, | ||
| + | namelbl = ttk.Label(content, | ||
| + | name = ttk.Entry(content) | ||
| + | |||
| + | onevar = BooleanVar() | ||
| + | twovar = BooleanVar() | ||
| + | threevar = BooleanVar() | ||
| + | onevar.set(True) | ||
| + | twovar.set(False) | ||
| + | threevar.set(True) | ||
| + | |||
| + | one = ttk.Checkbutton(content, | ||
| + | two = ttk.Checkbutton(content, | ||
| + | three = ttk.Checkbutton(content, | ||
| + | ok = ttk.Button(content, | ||
| + | cancel = ttk.Button(content, | ||
| + | |||
| + | content.grid(column=0, | ||
| + | frame.grid(column=0, | ||
| + | namelbl.grid(column=3, | ||
| + | name.grid(column=3, | ||
| + | one.grid(column=0, | ||
| + | two.grid(column=1, | ||
| + | three.grid(column=2, | ||
| + | ok.grid(column=3, | ||
| + | cancel.grid(column=4, | ||
| + | |||
| + | root.mainloop() | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Grid로 Frame 가운데 정렬 ===== | ||
| + | |||
| + | 따로 옵션이 없고, grid를 3x3 으로 설정해서 가운데 배치되도록 하는 방법으로. | ||
| + | |||
| + | <code python> | ||
| + | # 3x3 그리드 사용. configure()로 하는거 없이 그냥 비중 설정만해서 있는 것으로 세팅한다. | ||
| + | 오브젝트.grid(row=1, | ||
| + | 부모오브젝트.grid_rowconfigure(0, | ||
| + | 부모오브젝트.grid_rowconfigure(2, | ||
| + | 부모오브젝트.grid_columnconfigure(0, | ||
| + | 부모오브젝트.grid_columnconfigure(2, | ||
| + | </ | ||
| + | ===== 윈도우매니져 ===== | ||
| + | |||
| + | |||
| + | ====== 폰트 ====== | ||
| + | |||
| + | <code python> | ||
| + | from tkinter import font | ||
| + | |||
| + | def some_func(): | ||
| + | font = font.Font(famaily=' | ||
| + | |||
| + | # 어딘가에서 쓰기 | ||
| + | </ | ||
| + | |||
| + | ===== 기본 폰트를 변경 ===== | ||
| + | |||
| + | 정해진 기본폰트 ([[http:// | ||
| + | |||
| + | | TkDefaultFont | The default for all GUI items not otherwise specified. | | ||
| + | | TkTextFont | Used for entry widgets, listboxes, etc. | | ||
| + | | TkFixedFont | A standard fixed-width font. | | ||
| + | | TkMenuFont | The font used for menu items. | | ||
| + | | TkHeadingFont | The font typically used for column headings in lists and tables. | | ||
| + | | TkCaptionFont | A font for window and dialog caption bars. | | ||
| + | | TkSmallCaptionFont | A smaller caption font for subwindows or tool dialogs | | ||
| + | | TkIconFont | A font for icon captions. | | ||
| + | | TkTooltipFont | A font for tooltips. | | ||
| + | |||
| + | TkDefaultFont 를 바꿔보자 | ||
| + | |||
| + | <code python> | ||
| + | from tkinter import font | ||
| + | |||
| + | default_font = font.nametofont(" | ||
| + | default_font.configure(family=' | ||
| + | </ | ||
| + | |||
| + | ===== Frame ===== | ||
| + | |||
| + | <color black/ | ||
| + | <color black/ | ||
| + | <color black/ | ||
| + | <color black/ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||