02. Python-Programming(Application)(Tkinter)
02. Python-Programming(Application)(Tkinter)
[toc]
파이썬(응용) 과제2
Problem 1
- window 크기를 240x40으로 설정하고, 윈도우 발생 위치는 (200,200)으로 설정한다.
- window 크기 변경을 방지한다.
- y방향으로 패딩은 10을 준다.
- 배치는 pack을 사용한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 돌아감
# 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
아래와 같은 윈도우를 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 돌아감
# 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
아래와 같은 윈도우를 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 돌아감
# 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 돌아감
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()메시지
1
- Admin 아닌 경우 경고 메시지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 돌아감
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 창이 나오고 확인하면 전체 프로그램 종료
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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점)
1
2
3
# choice 사용 예
from random import *
choice(['가위','바위','보'])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 참고 코드
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 = 보
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 돌아감 디자인 한 번 신경쓰기!!
# 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()