Post

02. Python-Programming(Application)(Tkinter)

02. Python-Programming(Application)(Tkinter)

[toc]

파이썬(응용) 과제2

Problem 1

  1. window 크기를 240x40으로 설정하고, 윈도우 발생 위치는 (200,200)으로 설정한다.
  2. window 크기 변경을 방지한다.
  3. y방향으로 패딩은 10을 준다.
  4. 배치는 pack을 사용한다

image.png

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

아래와 같은 윈도우를 작성

image-8.png

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

아래와 같은 윈도우를 작성

image-5.png

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

  1. 아래와 같이 label, entry, button 위젯을 배치한다.
  2. user name entry는 focus()를 적용한다.
  3. user name을 입력한 수 button을 클릭하면 아래 entry에 Hello, user name! 출력
  4. Entry에 출력하려면 insert(시작위치, message) method 사용 예) message는 문자열, e1은 엔트리 객체 이름인 경우 e1.insert(0, message)

image.png

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

  1. 아래와 같이 label, entry, button을 배치

image.png

  1. Admin 명단 [Alice]
  2. User login클릭하면 sayHello() 메시지 박스 표시

image-2.pngimage-7.png

  1. Admin Login button
    • Admin인 경우는 sayHello()메시지

image-3.png

image-4.png

1
- Admin 아닌 경우 경고 메시지

image-6.png

image-5.png

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

  1. user_list에는 Jennifer와 Python이 등록되어 있다.
  2. username을 입력하고 login button을 클릭한다.
    • username이 등록된 user이면 greeting
    • 등록이 되어 있지 않으면 askretrycancel()을 사용하여 invalid username 경고 창을 표시하고 다시 시도 또는 취소를 선택할 수 있도록 작성한다.
  3. 취소를 선택하면 전체 윈도우 종료
  4. 다시 시도을 누르면 다시 입력하라는 메시지창을 출력 후 확인 누르면 입력 창으로 돌아감
  5. Logout 버튼을 누르면 확인 askyesno 창이 나오고 확인하면 전체 프로그램 종료

image.png


image-2.png


image-3.png

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

  1. 가위-바위-보 게임을 코딩하라
  2. Computer는 Random module의 choice()를 이용하여 가위-바위-보를 선택한다.
  3. 사람은 버튼을 누름으로 가위-바위-보를 선택한다
  4. 아래에 주어진 코드를 참고 하여 코드를 완성하라.

출력 예시

  • 아래 출력 예시는 결과를 간단히 표시한 것을 보여준다. 실제 문제에서는 창의 각종 위젯의 배치와 결과의 표시는 채점 대상이 된다. (코딩 10점/ 레이아웃 10점)

image.png

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()