개발 이야기

[파이썬 완전정복] '*'버튼 입력에 따라 랜덤 숫자 돌리기

ANDYLION 2020. 6. 16. 23:35
728x90
반응형

오늘은 파이썬 공부를 하고 있는 대학생이
고생을 하고 있다고 하여 도움을 청해
도움을 주고자 글을 씁니다.
 
tkinter는 파이썬에서 GUI 개발을 할 때 사용합니다.
 
구글 검색을 해보면 버튼, 콤보, 에디트 박스 등의 GUI를 생성하며,
기본적인 샘플로 계산기가 가장 좋은 예입니다.
 
저에게 요청한 내용은 다음과 같습니다.
 
랜덤 배열 키패드를 버튼으로 생성을 하고 '*' 버튼을 누를 때마다
랜덤 배열 키패드의 번호를 임의로 배열시킵니다.
random.shuffle(list)를 사용해서 숫자를 바꾸려도
시도하였으나 바뀌지 않아서 막막하다는 내용이였습니다.
 
자 그럼 한번 시작해볼까요?
 
먼저 tkinter와 random 함수를 사용하기 위해서는 아래와 같이 선언을 해줍니다.

# tkinter, random 선언
from tkinter import ttk
import tkinter
import random

그리고 전역으로 숫자를 랜덤으로 생성할 리스트를 초기화합니다.

list = [] #리스트 초기화

이제 GUI를 구성해보겠습니다.

window = tkinter.Tk() # 윈도우 생성
window.title("Random Number Sample") #윈도우 타이틀
window.geometry('320x480') #윈도우 사이즈

윈도우를 생성하고 타이틀과 사이즈까지 설정합니다.
 
그리고 이제 list에 숫자를 랜덤하게 삽입합니다.
예를 들어, 임의로 1~10의 숫자를 랜덤으로 삽입합니다.
여기서는 중복 허용입니다.
중복 불허용은 조금 생각해보시기 바랍니다.

for i in range(0, 10) : #10개의 랜덤 숫자를 리스트에 삽입
    list.insert(i, random.randint(1,10))
    
    
#result
#before [1, 1, 2, 4, 9, 5, 6, 1, 8, 8]
#after [1, 8, 6, 4, 2, 1, 5, 1, 8, 9]

result와 같이 리스트에 삽입됩니다.
그럼 이제 버튼을 만드는 코드입니다.

button0 = ttk.Button(window, text=str(list[0]))
button0.grid(row=1, column=0)
button1 = ttk.Button(window, text=str(list[1]))
button1.grid(row=1, column=1)
button2 = ttk.Button(window, text=str(list[2]))
button2.grid(row=2, column=0)
button3 = ttk.Button(window, text=str(list[3]))
button3.grid(row=2, column=1)
button4 = ttk.Button(window, text=str(list[4]))
button4.grid(row=3, column=0)
button5 = ttk.Button(window, text=str(list[5]))
button5.grid(row=3, column=1)
button6 = ttk.Button(window, text=str(list[6]))
button6.grid(row=4, column=0)
button7 = ttk.Button(window, text=str(list[7]))
button7.grid(row=4, column=1)
button8 = ttk.Button(window, text=str(list[8]))
button8.grid(row=5, column=0)
button9 = ttk.Button(window, text=str(list[9]))
button9.grid(row=5, column=1)
button10 = ttk.Button(window, text='#', width=20) #사용하지 않음
button10.grid(row=6, column=0)
button11 = ttk.Button(window, text='*', command=lambda:pressedButton('*'))
button11.grid(row=6, column=1)

버튼 역시 리스트로 만들게 되면 편하게 관리할 수 있습니다.
예제 코드이기 때문에 리스트보다는 쉽게 만들었습니다.
list화 하면 5줄로 줄일 수 있으니 공부하시기 바랍니다.
 
그리고 버튼을 눌렀을 때 이벤트를 위한
버튼 함수를 정의합니다.

#def 바튼을 누를 때
def pressedButton(value) :
    print(value, "pressed")
    print("before", list)
    random.shuffle(list)
    print("after", list)
    button0['text'] = list[0]
    button1['text'] = list[1]
    button2['text'] = list[2]
    button3['text'] = list[3]
    button4['text'] = list[4]
    button5['text'] = list[5]
    button6['text'] = list[6]
    button7['text'] = list[7]
    button8['text'] = list[8]
    button9['text'] = list[9]

 
함수 정의까지 끝났으면 이제 완료입니다.
그럼 결과물을 보겠습니다.

 

before
after
# Full Source code
# Random Number by '*' button
# 랜덤 배열 키패드를 만들어 보려고 하는데 *버튼을 누를때 마다
# 배열 버튼의 숫자들을 다시 랜램으로 배열시키고 싶어서 random.shuffle(list)를 썼는데
# 숫자가 바뀌지 않고 계속 그대로여서 막막합니다..
# 어떻게 하면 *버튼에 랜덤명령을 할수 있을까요?


from tkinter import ttk
import tkinter
import random


list =[] #리스트 초기화


#def 바튼을 누를 때
def pressedButton(value) :
    print(value, "pressed")
    print("before", list)
    random.shuffle(list)
    print("after", list)
    button0['text'] = list[0]
    button1['text'] = list[1]
    button2['text'] = list[2]
    button3['text'] = list[3]
    button4['text'] = list[4]
    button5['text'] = list[5]
    button6['text'] = list[6]
    button7['text'] = list[7]
    button8['text'] = list[8]
    button9['text'] = list[9]

window = tkinter.Tk() # 윈도우 생성
window.title("Random Number Sample") #윈도우 타이틀
window.geometry('320x480') #윈도우 사이즈


for i in range(0, 10) : #10개의 랜덤 숫자를 리스트에 삽입
    list.insert(i, random.randint(1,10))

button0 = ttk.Button(window, text=str(list[0]))
button0.grid(row=1, column=0)
button1 = ttk.Button(window, text=str(list[1]))
button1.grid(row=1, column=1)
button2 = ttk.Button(window, text=str(list[2]))
button2.grid(row=2, column=0)
button3 = ttk.Button(window, text=str(list[3]))
button3.grid(row=2, column=1)
button4 = ttk.Button(window, text=str(list[4]))
button4.grid(row=3, column=0)
button5 = ttk.Button(window, text=str(list[5]))
button5.grid(row=3, column=1)
button6 = ttk.Button(window, text=str(list[6]))
button6.grid(row=4, column=0)
button7 = ttk.Button(window, text=str(list[7]))
button7.grid(row=4, column=1)
button8 = ttk.Button(window, text=str(list[8]))
button8.grid(row=5, column=0)
button9 = ttk.Button(window, text=str(list[9]))
button9.grid(row=5, column=1)
button10 = ttk.Button(window, text='#', width=20) #사용하지 않음
button10.grid(row=6, column=0)
button11 = ttk.Button(window, text='*', command=lambda:pressedButton('*'))
button11.grid(row=6, column=1)

window.mainloop()

728x90
반응형
SMALL