상세 컨텐츠

본문 제목

[Python 파이썬 독학 활용2편 2일차] GUI(tkinter) - 2-4

파이썬 스터디/파이썬-Python 활용편2

by 후즈테크 2021. 8. 1. 23:53

본문

반응형

Quiz. 

 

[GUI 조건]
1. title : 제목 없음 - Windows 메모장

2. 메뉴 : 파일, 편집, 서식, 보기, 도움말

3. 실제 메뉴 구현 : 파일 메뉴 내에서 열기, 저장, 끝내기 3개만 처리
    3-1. 열기 : mynote.txt 파일 내용 열어서 보여주기
    3-2. 저장 : mynote.txt 파일에 현재 내용 저장하기
    3-3. 끝내기 : 프로그램 종료

4. 프로그램 시작 시 본문은 비어 있는 상태

5. 하단 status 바는 필요 없음

6. 프로그램 크기, 위치는 자유롭게 하되 크기 조정 가능해야 함

7. 본문 우측에 상하 스크롤바 넣기

◆ 결과물(동영상) .. 돌긴돈다

반응형

 

◆ 내가 작성한 코딩

from tkinter import *

root = Tk()

root.title("제목 없음 - Windows 메모장")
root.geometry("500x200")


menu = Menu(root)

menu_file = Menu(menu, tearoff=0)

def opens():
    txt.delete("1.0", END)
    read_file = open('mynote.txt', 'r')
    lines = read_file.readlines()
    for line in lines:
        txt.insert(END, line)
    read_file.close()
    

def saves():
    with open("mynote.txt", "w") as text_file:
        text_file.write(txt.get("1.0", END))
    
   

menu_file.add_command(label="열기", command=opens)
menu_file.add_command(label="저장", command=saves)

#menu_file.add_separator()
menu_file.add_command(label="끝내기", command = root.quit)
menu.add_cascade(label="파일", menu=menu_file)


# 편집 메뉴 (빈값)
menu.add_cascade(label="편집")


# 서식 메뉴 (빈값)
menu.add_cascade(label="서식")

# 보기 메뉴 (빈값)
menu.add_cascade(label="보기")

# 도움말 메뉴 (빈값)
menu.add_cascade(label="도움말")

root.config(menu=menu)


scrollbar = Scrollbar(root)
scrollbar.pack(side="right", fill ="y")


txt = Text(root, yscrollcommand=scrollbar.set)
txt.pack()

scrollbar.config(command=txt.yview)
root. mainloop()

 

별거 아니라고 생각했는데....

결론은 1시간을 헤멧다....ㅠㅠ

 

막힌 부분은 

    3-1. 열기 : mynote.txt 파일 내용 열어서 보여주기
    3-2. 저장 : mynote.txt 파일에 현재 내용 저장하기

두 과정이었는데, 30분도 넘게 고민하던 내용을 나도 코딩님은 너무나도 쉽게 피해갔다...

짭밥의 차이란 ...

 

문제가 생긴 과정은 열기와 저장이라는 너무나도 익숙한 단어에....

나도 모르게 open과 save로 command를 작성했다.

그런데 아무 이상 없어 보이는 코드가 저장 버튼을 누르면 error가 발생했다...

 

뭐지? 내가 만든 save 함수에는 아무런 arguments를 넣지 않았는데...왜 계속 arguments의 갯수가 안 맞을까?

 

30분을 찾아 헤매던 끝에....내가 정의한 save 보다 먼저 정의된 무엇인가 있구나!! 라는 생각을 하고서

함수명과 add_command 안에 command 에 s 를 하나 추가 하자마자 정상 동작....

(command=opens / command=saves)

 

이거구나 싶어 뿌듯한 마음으로 다시 보니 보란듯이 with open(23줄) 이 사용되고 있던게 아닌가!!!

 

오늘도 하나 배운다....

※ 함수와 코딩이 정상적인것 같은데 Error가 발생할 경우, 체크사항

  (TypeError: open() takes 0 positional arguments but 2 were given)

  : arguments 가 차이난다는 메세지가 발생할 경우, 동일한 함수명을 다른 누가 먼저 쓰고 있지 않은지 이름을 변경해보자 !!!

 

일단 동영상에서 보듯이 조건에 맞게 돌긴 잘 돈다!!!

하지만 숙제를 마치고 나도코딩님의 답안을 봤더니 미흡했던 부분들이 있었다.

 

 

 

◆ 보완사항

1. text 생성시, fill, expand option 사용

  - txt.pack(side="left", fill="both", expand=True)

    : 나는 해당 옵션을 주지 않아 해상도가 일정이상으로 커지면 빈칸이 나왔었다....

      해결 방법 조차 몰랐는데, frame 때 배웠던 fill과 expand 였다.

 

 

2. 열기전 파일 확인과정

 - if os.path.isfile(filename): # 파일 있으면 True, 없으면 False

    : insert 전 delete 하는 것 까지는 고려하여 작성을 했으나, 파일이 있는지 확인하는 과정은 고려하지 못했음.... 별거 아니었는데....중요한 걸 놓침..ㅠㅠ

 

  

 

◆ 나도코딩 님 답안

import os
from tkinter import *

root = Tk()
root.title("제목 없음 - Windows 메모장")
root.geometry("640x480") # 가로 * 세로

# 열기, 저장 파일 이름
filename = "mynote.txt"

def open_file():
    if os.path.isfile(filename): # 파일 있으면 True, 없으면 False
        with open(filename, "r", encoding="utf8") as file:
            txt.delete("1.0", END) # 텍스트 위젯 본문 삭제
            txt.insert(END, file.read()) # 파일 내용을 본문에 입력

def save_file():
    with open(filename, "w", encoding="utf8") as file:
        file.write(txt.get("1.0", END)) # 모든 내용을 가져와서 저장

menu = Menu(root)

menu_file = Menu(menu, tearoff=0)
menu_file.add_command(label="열기", command=open_file)
menu_file.add_command(label="저장", command=save_file)
menu_file.add_separator()
menu_file.add_command(label="끝내기", command=root.quit)
menu.add_cascade(label="파일", menu=menu_file)

# 편집, 서식, 보기, 도움말
menu.add_cascade(label="편집")
menu.add_cascade(label="서식")
menu.add_cascade(label="보기")
menu.add_cascade(label="도움말")

# 스크롤 바
scrollbar = Scrollbar(root)
scrollbar.pack(side="right", fill="y")

# 본문 영역
txt = Text(root, yscrollcommand=scrollbar.set)
txt.pack(side="left", fill="both", expand=True)
scrollbar.config(command=txt.yview)

root.config(menu=menu)
root.mainloop()

 

 

결론.

나도코딩님 리스펙

반응형

관련글 더보기

댓글 영역