파이썬에서 tkinter GUI를 프로그래밍 할 때 클래스를 사용하는 이유


19

나는 주로 파이썬으로 프로그래밍하고 Tkinter로 몇 가지 GUI를 프로그래밍했습니다. 내가 본 모든 자습서는 GUI에 클래스를 정의하고 사용하는 것을 권장했지만 GUI는 클래스없이 절차 만 사용하여 완벽하게 실행됩니다.

왜 수업을 사용합니까? 내 관점에서 볼 때 복잡성과 불필요한 코드의 추가 계층 인 것 같습니다.

답변:


19

왜 수업을 사용합니까? 객체 지향 프로그래밍을 수행하는 방법을 알고 있고 사소한 GUI를 작성한다고 가정하면 작업이 더 쉬워지기 때문입니다. 객체를 사용하면 코드를 자체 포함 된 모듈 식 단위로 쉽게 나눌 수 있으며 일반적으로 코드 모듈화는 모범 사례로 간주됩니다.

GUI는 레이블, 버튼, 스크롤바, 텍스트 영역 등의 객체로만 구성되므로 GUI 프로그래밍은 객체 지향 스타일에 적합합니다. 이미 객체를 사용하고 있으므로 코드를 더 큰 객체로 구성하는 것이 좋습니다 . 도구 모음은 객체, 상태 표시 줄은 객체, 탐색 창은 객체, 주 영역은 객체, 각 노트북 탭은 객체 등입니다.

코드가 복잡하지 않은 경우에도보다 실용적인 관점에서 호출하는 함수의 정의보다 파일의 초기에 바인딩 및 콜백을 정의 할 수 있습니다.

예를 들어, 간단한 예제 (tkinter를 import tkinter as tk(python3) 또는 import Tkinter as tk(python2) 와 같이 가져온 것으로 가정)를 고려하십시오 .

def quit(event=None):
    sys.exit()
root = tk.Tk()
label = tk.Label(root, text="Hello, world")
label.pack()
label.bind("<1>", quit)
root.mainloop()

나에게 그 코드의 흐름은 모두 잘못되었습니다. 종료하기 전에 quit 메소드를 정의해야하며, 루트 창 작성과 mainloop 호출은 다른 모든 코드로 구분됩니다.

그러나 클래스를 사용하면보다 자연스러운 순서로 코드를 작성할 수 있습니다.

class MyWindow(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Hello, world")
        label.pack()
        label.bind("<1>", self.quit)
    def quit(self, event=None):
        sys.exit()

root = tk.Tk()
MyWindow(root).pack()
root.mainloop()

GUI의 본문은 파일 맨 위에 있으며 지원 코드는 그 아래에 있습니다. 물론 함수를 사용하여 거의 같은 것을 달성 할 수 있습니다. 내 생각에, 수업은 모든 것을 조금 더 쉽게 만듭니다.

또 다른 장점은 이제 "기본"창에 대한 내용을 변경하지 않고도 포함 창을 쉽게 변경할 수 있다는 것입니다. 즉, 기본 GUI에 테두리 또는 완전히 새로운 섹션을 추가 할 수 있지만 MyWindow 내부에서 한 줄의 코드를 건드릴 필요는 없습니다. label.pack()UI에서 다른 모든 위젯의 명령문 및 팩 (또는 그리드) 명령문 을 변경해야하는 프로 시저 코드와 대조 하십시오.

그러나 객체 지향 접근 방식을 사용하는 것이 좋고 깨끗하며 유지 보수가 쉬운 코드를 작성하는 데 필요한 것은 아닙니다. 그것은 할 수 있을뿐만 아니라 가난한 코드로 이어질 수 있습니다. 하루가 끝나면 객체 지향 접근 방식은 도구 일뿐입니다. 사용 여부와 올바르게 사용하는지 여부는 많은 요인에 따라 다릅니다. 그래서 아주 잘 당신을 위해 할 수 있으며, 코드 쓰기 기능적인 스타일이 완벽하게 허용됩니다. 프로그램이 복잡해질수록 객체 지향 접근 방식으로 코드를 쉽게 구성하고 유지 관리 할 수 ​​있습니다.


두 번째 예에서 왜 프레임을 사용 했습니까? 첫 번째 예에서와 같이 피할 수 없습니까? 클래스와 함께 프레임을 사용하는 데 비밀이 있습니까?
multigoodverse

2
프레임은 편의상 간단합니다. Frame에서 상속받는 비밀은 없습니다. 나는 object다른 클래스 에서 상속받을 수 있었지만 일반적으로 어쨌든 프레임을 만듭니다. 프레임에 모든 것을 넣을 경우 클래스를 프레임으로 만드는 것이 좋습니다. .
Bryan Oakley

1
이해합니다, 감사합니다! 또한 다른 사람들이 변수보다 먼저 self를 사용하는 것을 보았지만, label=tk.Label()대신에 비슷한 것을 사용하고 self.tk.Label()있습니다. 스타일 선택입니까? 다음은 self를 사용하는 예입니다. python-textbok.readthedocs.org/en/1.0/…
multigoodverse

1
@BryanOakley, MyWindow .__ init__의 다음 줄에서 루트 대신 부모를 사용하려고했다고 생각합니다. "label = tk.Label (root, text ="Hello, world ")"
user3885927

1
@ user3885927 : 예! 와우, 누군가 그것을 알아 차리는데 거의 3 년이 걸렸습니다. 비록 클래스 자체가 프레임이기 때문에 parent오히려 아닙니다 self. 감사!
Bryan Oakley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.