본문 바로가기
programming/Python

파이썬 tkinter 그리드 레이아웃 위젯 동적 생성 하기 Dynamically Create Widget in grid layout

by 개코 - 개발과 코딩 2022. 1. 4.

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 위젯으로 변경이 되어 잘 출력되고 있다.

그렇다면 여기서 또 궁금해 진다.

어떤 버튼이 눌렸는지 궁금해질 것이다.

미안하다 다음으로 미룬다.

얘기가 길어질 것 같은 느낌이기 때문이다.

반응형

댓글