02. Python-Programming(Application)(Tkinter)
02. Python-Programming(Application)(Tkinter)
[toc]
파이썬(응용) 과제2
Problem 1
- window 크기를 240x40으로 설정하고, 윈도우 발생 위치는 (200,200)으로 설정한다.
- window 크기 변경을 방지한다.
- y방향으로 패딩은 10을 준다.
- 배치는 pack을 사용한다
# 돌아감 # Problem 1 code from tkinter import * window = Tk() # code 완성 window.title("Hello") window.geometry("240x40+200+200") # window 크기를 240x40으로 설정하고, 윈도우 발생 위치는 (200,200)으로 설정 window.resizable(0, 0) # 크기 변경 방지 message = Label(window, text="안녕하세요") message.pack(pady=10) # y방향으로 패딩은 10을 주고, 배치는 pack을 사용한다 window.mainloop() Problem 2
아래와 같은 윈도우를 작성
# 돌아감 # Problem 2 code import tkinter as tk from tkinter import ttk # root window root = tk.Tk() root.title('Login') root.resizable(0, 0) # code 완성 # username username_label = ttk.Label(root, text="Username:") username_label.grid(column = 0, row = 0, sticky=W, padx=5, pady=5) username_entry = ttk.Entry(root) username_entry.grid(column = 1, row = 0, sticky=E, padx=5, pady=5) # password password_label = ttk.Label(root, text="Password:") password_label.grid(column=0, row=1, sticky=W, padx=5, pady=5) password_entry = ttk.Entry(root, show="*") password_entry.grid(column=1, row=1, sticky=E, padx=5, pady=5) # login login_button = ttk.Button(root, text="Login") login_button.grid(column=0, row=2,sticky=E, padx=5, pady=5) root.mainloop() 2022-10-31 22:27:26.830 python[52460:2429270] TSM AdjustCapsLockLEDForKeyTransitionHandling - _ISSetPhysicalKeyboardCapsLockLED Inhibit Problem 3
아래와 같은 윈도우를 작성
# 돌아감 # Problem 3 code import tkinter as tk from tkinter import ttk # root window root = tk.Tk() root.title('Login') root.resizable(0, 0) # code 완성 # username username_label = ttk.Label(root, text="Username:") username_label.grid(column = 0, row = 0, sticky=W, padx=5, pady=5) username_entry = ttk.Entry(root) username_entry.grid(column = 1, row = 0, sticky=E, padx=5, pady=5) # password password_label = ttk.Label(root, text="Password:") password_label.grid(column=0, row=1, sticky=W, padx=5, pady=5) password_entry = ttk.Entry(root, show="*") password_entry.grid(column=1, row=1, sticky=E, padx=5, pady=5) # login login_button = ttk.Button(root, text="Login") login_button.grid(column=1, row=2, sticky=W+E+N+S, padx=8, pady=5) root.mainloop() Problem 4
- 아래와 같이 label, entry, button 위젯을 배치한다.
- user name entry는 focus()를 적용한다.
- user name을 입력한 수 button을 클릭하면 아래 entry에 Hello, user name! 출력
- Entry에 출력하려면 insert(시작위치, message) method 사용 예) message는 문자열, e1은 엔트리 객체 이름인 경우
e1.insert(0, message)
# 돌아감 from tkinter import * from tkinter import ttk def sayHello(*arg): message = "Hello, "+ username.get() +"!" e2.insert(0, message) window = Tk() window.title("Hello 2") # code 완성 frame = Frame(window) frame.pack(pady=10, padx = 10) L1 = ttk.Label(frame, text="User Name:") L1.grid(row=0, column=0, padx = 2, pady = 2) username = StringVar() e1 = ttk.Entry(frame, width = 20, textvariable = username) e1.grid(row=0, column=1, padx = 5) e2 = ttk.Entry(frame, width = 20) e2.grid(row=1, column=1, padx = 5) b = ttk.Button(frame, text="Click", command = sayHello, width=5) b.grid(row=1, column=0, padx = 2, pady = 3) # e1 entry focus e1.focus() # Entry창에서 입력 후 return 하면 명령 실행 window.bind("<Return>", sayHello) ### entry 창에 실행 결과를 띄울 수 없음 window.mainloop() Problem 5
- 아래와 같이 label, entry, button을 배치
- Admin 명단 [Alice]
- User login클릭하면 sayHello() 메시지 박스 표시
- Admin Login button
- Admin인 경우는 sayHello()메시지
- Admin 아닌 경우 경고 메시지 # 돌아감 from tkinter import * from tkinter import ttk from tkinter import messagebox admin_list = ["Alice"] # admin list def sayHello(*args): message = "Hello, " + username.get() +"!" messagebox.showinfo("Greeting", message) def adminLog(*args): if username.get() in admin_list: message = "Hello, admin "+ username.get() + "!" messagebox.showinfo("Welcome", message) else: message = username.get() + " is not an admin"+"!" messagebox.showwarning("Warning", message) # code 완성 window = Tk() window.title("Admin login") frame = Frame(window) frame.grid(row=0, column=0, padx = 10, pady = 10) L1 = ttk.Label(frame, text="User Name:", width=10) L1.grid(row=0, column=0) username = StringVar() e1 = ttk.Entry(frame, textvariable = username) e1.grid(row=0, column=1) ulb = ttk.Button(frame, text = "User Login", width=10, command=sayHello) ulb.grid(row=1, column=0) alb = ttk.Button(frame, text="Admin Login", width=10, command=adminLog) alb.grid(row=1, column=1, sticky=E, ) # frame 하부 위젯 패딩 일괄 설정 for child in frame.winfo_children(): child.grid_configure(padx = 5, pady = 5) window.mainloop() Problem 6
- user_list에는 Jennifer와 Python이 등록되어 있다.
- username을 입력하고 login button을 클릭한다.
- username이 등록된 user이면 greeting
- 등록이 되어 있지 않으면 askretrycancel()을 사용하여 invalid username 경고 창을 표시하고 다시 시도 또는 취소를 선택할 수 있도록 작성한다.
- 취소를 선택하면 전체 윈도우 종료
- 다시 시도을 누르면 다시 입력하라는 메시지창을 출력 후 확인 누르면 입력 창으로 돌아감
- Logout 버튼을 누르면 확인 askyesno 창이 나오고 확인하면 전체 프로그램 종료
# Problem 6 code from tkinter import * from tkinter import ttk from tkinter import messagebox user_list = ['Jennifer', 'Python'] # User list def login(*args): if username.get() in user_list: message = "Hello, " + username.get() +"!" messagebox.showinfo("Greeting", message) else: answer = messagebox.askretrycancel(title='Invalid username', message= username.get()+' is an invalid username.\nDo you want to retry?') if answer: messagebox.showinfo(title='Information', message='Try to enter username again.') else: window.destroy() def logout(*args): message = "Do youn want to logout, " + username.get() +"?" answer = messagebox.askyesno("Askyesno", message) if answer: window.destroy() # code 완성 window = Tk() window.title("messagebox") frame = Frame(window) frame.grid(row=0, column=0, padx=10, pady=10) username = StringVar() # user name 입력창 user_name = ttk.Label(frame, text="User Name:") user_name.grid(column=0, row=0) user_entry = ttk.Entry(frame, textvariable=username) user_entry.grid(column=1, row=0) # 로그인 버튼 user_login = ttk.Button(frame, text="Login", width=10, command=login) user_login.grid(column = 0, row=1) # 로그아웃 버튼 user_logout = ttk.Button(frame, text="Logout", width=10, command=logout) user_logout.grid(column = 1, row=1, sticky=E) # frame 하부 위젯 패딩 일괄 설정 for child in frame.winfo_children(): child.grid_configure(padx = 5, pady = 5) window.mainloop() Problem 7
- 가위-바위-보 게임을 코딩하라
- Computer는 Random module의 choice()를 이용하여 가위-바위-보를 선택한다.
- 사람은 버튼을 누름으로 가위-바위-보를 선택한다
- 아래에 주어진 코드를 참고 하여 코드를 완성하라.
출력 예시
- 아래 출력 예시는 결과를 간단히 표시한 것을 보여준다. 실제 문제에서는 창의 각종 위젯의 배치와 결과의 표시는 채점 대상이 된다. (코딩 10점/ 레이아웃 10점)
# choice 사용 예 from random import * choice(['가위','바위','보']) # 참고 코드 from tkinter import * from tkinter import ttk from random import * root = Tk() def select(human_choice): computer_choice = choice(['가위','바위','보']) print('Computer choice =', computer_choice) print('Human choice =', human_choice) frame = Frame(root) frame.pack(pady = 10) b1 = ttk.Button(frame, text='가위', command=lambda: select('가위')) b1.pack(pady = 2) b2 = ttk.Button(frame, text='바위', command=lambda: select('바위')) b2.pack(pady=2) b3 = ttk.Button(frame, text='보', command=lambda: select('보')) b3.pack(pady=2) root.mainloop() Computer choice = 바위 Human choice = 가위 Computer choice = 바위 Human choice = 바위 Computer choice = 바위 Human choice = 보 # 돌아감 디자인 한 번 신경쓰기!! # code 완성 from tkinter import * from tkinter import ttk from random import * root = Tk() root.title("Let's play Rock, Scissor, Paper") def clear(): e1.delete(0, "end") e2.delete(0, "end") e3.delete(0, "end") #message = '' def select(human_choice): computer_choice = choice(['가위','바위','보']) if human_choice == '가위': if computer_choice == '가위': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '비겼습니다' elif computer_choice == '바위': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '컴퓨터 승리' elif computer_choice == '보': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '사람 승리' elif human_choice == '바위': if computer_choice == '가위': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '사람 승리' elif computer_choice == '바위': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '비겼습니다' elif computer_choice == '보': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '컴퓨터 승리' elif human_choice == '보': if computer_choice == '가위': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '컴퓨터 승리' elif computer_choice == '바위': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '사람 승리' elif computer_choice == '보': message1 = '컴퓨터 : ' + computer_choice message2 = '사람 : ' + human_choice message3 = '비겼습니다' clear() # 앞에 누적된 메시지 초기화 e1.insert(0, message1) e2.insert(0, message2) e3.insert(0, message3) frame = Frame(root) frame.pack(pady = 10) # button #photoS = PhotoImage(file="/Users/goyeonghun/Desktop/All/Hongik Univ/1학년 2학기/파이썬/과제/문제 풀이/img/scissors.jpeg") b1 = ttk.Button(frame, text='가위', command=lambda: select('가위')) b1.pack(pady = 2) #photoR = PhotoImage(file="/Users/goyeonghun/Desktop/All/Hongik Univ/1학년 2학기/파이썬/과제/문제 풀이/img/rock.jpeg") b2 = ttk.Button(frame, text='바위', command=lambda: select('바위')) b2.pack(pady=2) #photoP = PhotoImage(file="/Users/goyeonghun/Desktop/All/Hongik Univ/1학년 2학기/파이썬/과제/문제 풀이/img/paper.jpeg") b3 = ttk.Button(frame, text='보', command=lambda: select('보')) b3.pack(pady=2) # entry computer = StringVar() e1 = ttk.Entry(frame, textvariable = computer, width=12) e1.pack(pady=2) human = StringVar() e2 = ttk.Entry(frame, textvariable = human, width=12) e2.pack(pady=2) result = StringVar() e3 = ttk.Entry(frame, textvariable = result, width=12) e3.pack(pady=2) root.mainloop() 