tkinter 는 동적으로 widget 을 만들어 붙일 수 있다. grid에 동적으로 위젯을 붙이는 것은 좋은 예제가 된다. 계산기 버튼을 만들 때도 그렇다. 반복문을 사용하면 편하게 widget 을 붙일 수 있지만, 어디까지나 패턴을 찾으면 더 편하다. 굳이 패턴이 아니더라도 위젯들은 동적으로 붙을 수 있다. 위젯과 버튼을 반복문을 통해 동적으로 위젯을 grid 에 붙여 본다.
파이썬 tkinter 그리드 레이아웃 버튼 동적 생성 하기
Dynamically Create Button in grid layout
파이썬 tkinter에서 grid 레이아웃을 이용해 라벨을 배치했다.
이전에 라벨을 생성하면 그리드에 여러개 붙였다.
삽질이었지만 공통점을 발견할 수 있다.
바로 행과 열의 숫자이다.
반복문을 돌리면 뭔가 편할 것 같은 생각이 든다.
위젯 동적 생성
위젯을 동적으로 생성하고 없애고 속성을 변경하는 것은 간헐적으로 필요하다.
동적인 목록을 형성한다거나 결과물에 추가정보를 보여줘야 할 때가 그렇다.
동적으로 생성하는 것은 위젯을 생성하는 방법과 같다.
이전에 했던 코드를 이용해 동적으로 위젯을 만들어 본다.
패턴을 찾자.
위에서 언급한 이전 포스팅을 보면 패턴을 보여주고 있다.
vLabel1 = Label(vWindow)
vLabel1.config(text='[ 0 , 0 ]')
vLabel1.grid(row=0, column=0)
그렇다 이 부분이 패턴을 보인다.
변경되는 부분은 text 부분과 grid 설정부분이다.
3 X 3 grid 를 만들려면 이중루프 반복문을 통해 만들 수 있다는 결론을 내릴 수 있다.
이중루프 반복문은 for 문을 이중으로 배치하는 것을 말한다.
for 값 in range(시작값, 종료값, 증가값) :
for 값 in range(시작값, 종료값, 증가값) :
// 코드작성
반복문으로 위젯 생성
반복문과 위젯생성 방법을 알았으니 이제 실제로 만들어 본다.
이중 반복문을 사용하고 이전에 사용한 Label 위젯을 grid 에 붙일 것이다.
코드를 보자.
#----- import 모듈
import tkinter.messagebox as msgbox
from tkinter import *
from datetime import datetime
#----- 함수
#----- 메인
# 윈도우 창 생성
vWindow = Tk()
vWindow.title('윈도우창 타이틀')
vWindow.geometry('640x320')
vWindow.option_add('*Font', '돋음 20')
# Label 동적 생성
for vRow in range(0, 3, 1) :
for vColumn in range(0, 3, 1) :
vLabel = Label(vWindow)
vLabel.config(text= f'[{vRow},{vColumn}]')
vLabel.grid(row=vRow, column=vColumn)
# 윈도우 창 실행
vWindow.mainloop()
반복문으로 행과 열을 반복한다.
반복하면서 Label 을 생성하고 붙이고 있는 모습을 볼 수 있다.
결과 화면을 보자.
귀엽게 붙었다.
동적으로 위젯을 만들고 붙일 수 있다.
하지만, 뭔가 아쉽다.
버튼을 이용해 테스트가 하고 싶을 것이다.
그렇다면 라벨 부분만 버튼으로 바꿔 보자.
#----- import 모듈
import tkinter.messagebox as msgbox
from tkinter import *
from datetime import datetime
#----- 함수
#----- 메인
# 윈도우 창 생성
vWindow = Tk()
vWindow.title('윈도우창 타이틀')
vWindow.geometry('640x320')
vWindow.option_add('*Font', '돋음 20')
for vRow in range(1, 4, 1) :
for vColumn in range(0, 3, 1) :
vButton = Button(vWindow)
vButton.config(text= f'[{vRow},{vColumn}]')
vButton.grid(row=vRow, column=vColumn)
# 윈도우 창 실행
vWindow.mainloop()
Label 위젯을 사용한 것과 다르지 않다.
Label 위젯을 Button 위젯으로 변경했을 뿐이다.
결과 화면을 보자.
Label 위젯이 Button 위젯으로 변경이 되어 잘 출력되고 있다.
그렇다면 여기서 또 궁금해 진다.
어떤 버튼이 눌렸는지 궁금해질 것이다.
미안하다 다음으로 미룬다.
얘기가 길어질 것 같은 느낌이기 때문이다.
'programming > Python' 카테고리의 다른 글
파이썬 tkinter place 레이아웃 절대좌표 이용 (0) | 2022.01.08 |
---|---|
파이썬 tkinter grid 버튼에 이벤트 커맨드 설정 (0) | 2022.01.06 |
파이썬 tkinter grid 위젯 배치하기 Layout python grid (0) | 2022.01.03 |
파이썬 tkinter pack 메서드 위젯 배치하기 Layout python widget (0) | 2022.01.02 |
파이썬 tkinter 라벨 위젯의 사용 python label widget (0) | 2022.01.01 |
댓글