Bonjour, tout le monde!

[PySide 튜토리얼] 02. 첫 번째 프로그램 본문

Programming/PySide

[PySide 튜토리얼] 02. 첫 번째 프로그램

hygoni 2017. 2. 19. 01:07

원문 : http://zetcode.com/gui/pysidetutorial/firstprograms/

간단한 예제


아래는 작은 윈도우를 띄우는 아주 간단한 예제입니다. (윈도우로 많은 것을 할 수는 있지만요.)

사실 윈도우를 띄우는 것도 아주 많은 코드가 필요하지만, 대부분의 프로그램이 같은 코드를 반복하기 때문에

우리는 누군가 이미 만든 것을 사용하는 것이죠. 따라서 우리가 그런 부분을 따로 작성할 필요는 없습니다.



이 예제는 화면에 작은 윈도우를 띄우는 기능을 합니다.


필요한 모듈을 임포트합니다. GUI 위젯은 QtGui 모듈에 있습니다.



모든 PySide 애플리케이션은 QtGui 모듈에 있는 애플리케이션 오브젝트를 만들어야 합니다.

그리고 파이썬 스크립트가 명령프롬프트에서 작동할 수 있으므로 sys.argv 파라미터에서 커맨드라인에서 얻은 인자값을 담고 있습니다. 


QWidget 위젯은 PySide에서 모든 UI의 기반이 되는 클래스인데,

이 코드에서는 QWidget의 생성자를 호출합니다.(QWidget은 부모 클래스가 없는데, 부모 클래스가 없는 위젯을 윈도우라고 하죠.)



resize()함수는 위젯의 크기를 바꿔줍니다. (단위는 픽셀)



말 그대로 윈도우의 타이틀바에 표시되는 타이틀을 수정합니다.



show() 함수는 위젯을 화면에 띄워줍니다.



마지막으로, 위의 코드로 어플리케이션의 메인 루프로 들어가게 됩니다.

이 때 부터 (메인 루프에서) 우리가 프로그램을 종료하거나 메인 위젯이 사라질 때 까지 이벤트를 관리할 수 있게 됩니다. 


혹시 왜 app.exec_에 언더바가 있는지 궁금하실 수도 있는데, 그건 exec는 파이썬의 키워드이기 때문입니다.

(명명 규칙에 어긋남)


 

<샘플 코드를 실행한 모습 >


애플리케이션 아이콘

애플리케이션 아이콘은 타이틀바 왼쪽의 작은 사진입니다.(네모난거)

아래 예제에서 PySide에선 아이콘을 어떻게 표시하나 확인해보죠.




파이썬 프로그래밍 언어는 절차지향과 객체지향 스타일을 지원하는데, 처음의 예제는 절차지향으로 작성한 것이고

위의 예제가 객체지향 스타일로 작성한 것입니다. 


객체지향 프로그래밍에서 중요한 세 가지는 클래스, 데이터, 메서드 입니다. 
위의 코드에서는 QtGui.QWidget 클래스를 상속받는 Example 클래스를 만들었는데, 따라서
두 개의 생성자를 호출해야 합니다.(QtGui.QWidget 클래스와 Example 클래스의 생성자)
상속받은 클래스는 super() 메서드로 호출합니다.


위의 세 함수는 모두 QtGui.QWidget 클래스에서 상속 받은 것인데, 
setGeometry()는 화면에 윈도우를 띄우고, 크기를 변경합니다.
setGeometry(X좌표, Y좌표, 폭, 높이)

그리고 마지막 함수는 애플리케이션 아이콘을 설정합니다. 우린 이걸 위해서 앞에서 QtGui.QIcon 오브젝트를 생성했죠.
QtGui.QIcon은 표시될 아이콘의 경로를 입력받습니다.




위의 코드에서는 스타트업 코드를 main() 메서드에 넣었습니다.
(역주 :
사실 파이썬에는 C언어 처럼 메인 함수[각주:1]가 존재하지는 않는데, 

if __name__ == '__main__': # 이 프로그램이 모듈이 아니라 메인 프로그램으로 시작되었을 때
main() #main() 함수 호출

위의 코드 두줄로 main()을 메인 함수로 만들어 준 것입니다.

)

<아이콘을 적용한 모습 >


툴팁 띄우기




이 정적 함수는 툴팁에 사용될 글꼴을 설정합니다.


setTooltip() 메서드로 툴팁을 만들 수 있습니다.(서식있는 텍스트를 사용할 수도 있습니다.)




버튼 위젯을 만들고 툴팁을 설정하는 코드입니다.



버튼의 크기를 변경하고, 윈도우에서 이동시켰습니다.

sizeHint()는 버튼의 기본 크기를 반환합니다.


<버튼과 툴팁을 적용한 모습>


윈도우 닫기

윈도우 창은 X버튼을 눌러서 닫을 수 있지만, 다음 예제에서는 프로그램 상에서 윈도우가 닫히도록 하겠습니다.

여기서 우리는 간단하게 시그널과 슬롯을 다룰겁니다.


아래의 코드는 우리가 예제에서 사용할 QtGui.QPushButton 의 생성자입니다.



text 파라미터는 버튼 위에 표시될 텍스트이고, parent는 버튼을 올려놓을 위젯입니다.

(여기선 QtGui.QWidget이 되겠죠?)




위의 예제에서는 종료 버튼을 만들었습니다. 이 버튼을 누르면 어플리케이션이 종료됩니다.



QtGui.QPushButton 클래스의 인스턴스로 버튼을 만들었습니다.

'Quit'은 버튼의 라벨이고, self는 QtGui.QWidget를 상속받은 Examle 위젯입니다.



PySide에서 이벤트[각주:2] 처리 시스템은 시그널[각주:3]과 슬롯[각주:4] 매커니즘으로 작동하는데,

우리가 버튼을 누를 때 'clicked' 시그널이 발생합니다. 

슬롯은 Qt 슬롯이나 파이선 함수가 될 수 있습니다.[각주:5]


또한 QtCore.QCoreApplication은 메인루프에서 모든 이벤트를 처리하고, instance() 메서드는 현재 인스턴스를 반환합니다. 

참고로 QtCore.QCoreApplication은 QtGui.QApplication과 함께 생성됩니다.


우리는 clicked 시그널을 quit() 메서드와 연결했으므로 clicked 시그널이 발생하면

quit() 메서드와 연결되어 애플리케이션을 종료합니다.


여기에서의 의사소통은 두 객체간의 의사소통에 의해 이루어집니다. 버튼이 이벤트를 발생시키고,

애플리케이션 객체가 이를 받는 것이죠.



<종료 버튼을 만든 모습>

메시지 박스
기본적으로 우리가 타이틀바의 x버튼을 누를 때 QtGui.QWidget은 종료됩니다. 그런데 이 기본 동작을
바꿀 수가 있습니다. 예를들어 우리가 파일을 열어서 수정했을 때 확인 메시지를 띄우는 것이죠.


QtGui.QWidget을 닫으면 QCloseEvent가 생성됩니다.
위젯의 종료 동작을 바꾸려면 closeEvent() 이벤트 핸들러를 재구현할 필요가 있습니다.


이 코드는 Yes와 No 버튼이 담긴 메시지 박스를 띄웁니다.
'Message'는 타이틀 바에 들어갈 내용이고, "Are you sure to quit?"은 다이얼로그에 표시될 문자열입니다.
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No 는 다이얼로그에 표시될 버튼의 조합이고,
마지막의 QtGui.QMessageBox.No는 키보드에 포커스가 가는 기본 버튼입니다.

여기서 반환값은 reply 변수에 저장됩니다.


여기서는 Yes 버튼을 누르면 종료 이벤트를 수락하고,
No 버튼을 누르면 종료 이벤트를 무시합니다. 


<메시지 박스>


윈도우를 중간으로 옮기기




윈도우를 이동시킬 코드는 우리가 만든 center() 메서드에 있습니다.


여기서는 메인 윈도우의 위치를 지정하는 직사각형을 얻습니다. 
여기에는 모든 창 프레임이 포함됩니다. 



여기서는 윈도우의 해상도를 파악하고 중간 지점을 얻습니다.




이제 직사각형의 폭과 높이가 존재합니다. 이제 직사각형의 중앙을 스크린의 중앙으로 설정합니다.

(직사각형의 크기는 변하지 않습니다.)





애플리케이션 윈도우의 좌측 상단을 qr 직사각형의 좌측 상단으로 이동합니다.


여기까지 튜토리얼이 끝났습니다. 이번 시간에는 PySide에서의 몇 가지 기본적인 것들을 알아봤습니다.




  1. 프로그램이 시작된 후 맨 처음 시작되는 함수 [본문으로]
  2. 말 그대로 버튼 누르기, 키보드 누르기, 마우스 움직이기 등의 '사건' 을 말합니다. 우리가 컴퓨터에 무언가를 할 때 마다 매번 발생합니다. [본문으로]
  3. 이벤트가 발생했을 때의 신호 [본문으로]
  4. 시그널을 처리하는 함수 [본문으로]
  5. Qt 슬롯은 기본 처리, 파이선 함수는 사용자 정의 정도로 알아두시면 됩니다. [본문으로]
0 Comments
댓글쓰기 폼