Post List

레이블이 PyQt인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PyQt인 게시물을 표시합니다. 모든 게시물 표시

2015년 10월 7일 수요일

Python GUI Programming : PyQt #04 UI Control 제어하기 (예제로 notepad 만들기)

이번에는 직접적으로 PyQt에서 생성한 control 들을 제어해보도록 하겠습니다.
예제로 notepad 기능을 하는 application을 만들어 보겠습니다.

  - file을 읽어서 그 내용을 화면에 표시합니다.
  - 그 내용을 수정해서 다른 이름의 file로 저장을 합니다.

위 2가지 기능을 하는 application을 PyQt로 만들어 보겠습니다.

1. Qt Designer에서 dialog 에 control 배치



위 그림을 참조하여 control 들을 배치하고 명칭을 변경합니다.

2. Edit signal / slot 을 눌러서 2개의 button 을 form 에 연결합니다.

form에는 사용자 정의 slot을 추가합니다.
  - slotFileOpen()
  - slotFileSave()

 사용자 정의 slot 추가에 대한 자세한 사항은 아래 Link 참조 부탁드립니다.
  http://devluna.blogspot.kr/2015/09/python-gui-programming-pyqt-03.html





3. PyMemo.ui 라는 이름으로 저장합니다.

4. 같은 경로에 PyMemo.py 파일을 생성하여 Python code를 구현합니다.

  4.1. 먼저 PyQt UI를 참조하는 Form class를 생성합니다.

import sys

from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot

class PyMemoForm(QtWidgets.QDialog):
    def __init__(self, parent = None):
        QtWidgets.QDialog.__init__(self, parent)
        self.ui = uic.loadUi("PyMemo.ui", self)
        self.ui.show()

  4.2. slotFileOpen() 을 구현합니다.

      - QtWidgets.QFileDialog.getOpenFileName()을 이용하여 file명을 dialog에서 입력합니다.
      - edit_fileName , text_context 라는 control에 file명 및 file 내용을 입력합니다.

    * control은 self.ui.control명칭 으로 접근이 가능합니다.
    * control의 자세한 사용법은 Qt Reference를 참조하시면 됩니다.
      (C++ 기준으로 되어 있으나, Python 타입으로 연관시키는 것이 어렵진 않습니다.)

      - QLineEdit http://doc.qt.io/qt-5.5/qlineedit.html
      - QTextEdit http://doc.qt.io/qt-5.5/qtextedit.html

    @pyqtSlot()
    def slotFileOpen(self):
        fileName = QtWidgets.QFileDialog.getOpenFileName()
        fullName = fileName[0]
        self.ui.edit_fileName.setText(fullName)
        fHandle = open(fullName)
        self.ui.text_context.setPlainText(fHandle.read())

  4.3 slotFileSave() 를 구현합니다.

      - QtWidgets.QfileDialog.getSaveFileName()을 이용하여 file명을 dialog에서 입력합니다.
      - text_context의 값을 file로 저장합니다.

@pyqtSlot()
    def slotFileSave(self):
        fileName = QtWidgets.QFileDialog.getSaveFileName()
        fullName = fileName[0]
        fHandle = open(fullName, 'w')
        context = self.ui.text_context.toPlainText()
        fHandle.writelines(context)
        fHandle.close()

5. 끝

  실행을 해서 결과를 확인하시면 됩니다.

* 전체 Code

1. PyMemo.py

2. PyMemo.ui

2015년 9월 13일 일요일

Python GUI Programming : PyQt #03 사용자 정의 signal/slot 추가 및 python code에서 기능 구현

앞서 작성하던 ui 파일에서 계속 진행하겠습니다.
화면 상단 메뉴 중에 Edit Signal / Slot 버튼을 누르면 현재 화면의 control 들 간의 signal / slot 연결 관계 확인이 가능합니다.



1st button 에서 마우스를 click한 상태로 drag 한 후 dialog 상 아무곳에서나 마우스를 놓습니다.



연결 설정 창이 뜨는데, Dialog (QDialog) 쪽에서 편집을 누릅니다.



아래의 + 표시를 눌러서 사용자 정의 slot 1 ~ 3 을 추가합니다. 별도로 이름은 변경해주지 않아도 됩니다.



그런 다음 clicked() Signal 과 slot1() Slot을 연결해줍니다.



같은 방법으로 2nd Button slot2(), 3rd Button slot3()을 각각 연결해줍니다.



사용자가 정의하 Slot()은 직접 구현해 줘야 합니다.
Python Code로 구현하도록 하겠습니다.

먼저 HelloPyQt.ui 파일을 저장 한 후 해당 파일과 동일한 위치에 Python Code를 작성하도록 하겠습니다.




앞서 본 예제에서 slot 1 ~ 3 에 대한 구현을 추가한 것입니다. 나머지는 동일 합니다.

해당 python file을 실행하여 각 button을 눌렀을 때 상단의 labal의 내용이 바뀌는 것을 확인하였으면 성공적으로 적용된 것입니다.

2015년 9월 11일 금요일

Python GUI Programming : PyQt #02 python 에서 Qt ui파일 사용하기

앞 장에서 작성한 Qt ui 파일과 같은 경로에 아래와 같이 입력한 python 파일을 생성하시면 됩니다.

PyQt4 버전일 경우에는 QtWidgets 대신 QtGuiimport 해주시면 됩니다.
PyQt4 와 PyQt5는 서로 호환되지 않습니다.
PyQt4 에서 PyQt5로 오면서 QtGui QtGui, QtWidgets, QtPrintSupport 로 분리되었습니다.

QtWidgets.QDialog 를 상속받은 HelloQtForm class를 만들어서 초기화 method (__init__) 에 ui 파일을 load 하고 화면에 보이도록 하였습니다.

if __name__ == '__main__' 의 의미는 해당 파일이 다른 곳에서 module 처럼 이용되는 것이 아니라 직접 실행 했을 경우라는 뜻입니다.
module 개발시 아래에 test code 를 적어두는 용도로 사용하면 편리합니다.

2015년 9월 8일 화요일

Python GUI Programming : PyQt #01 Designer 사용 및 Signal/Slot

설치된 Program 목록에서 Qt Designer 를 선택하여 실행합니다.

처음 뜨는 화면에서 Dialog without Buttons 를 선택하면 빈 Dialog 가 생성됩니다.



Toolbox 에서 Label, Button, LineEditor 등을 선택하여 화면의 모양과 같이 편집합니다.
Text 및 글자체 등은 속성 창에서 편집하면 됩니다.

 

Properties 창을 보시면 선택한 control에 따라서 항목이 바뀌는데,
기본적으로 QObject, QWidget 은 항상 표시되어있고,
control 마다 다르게 아래에 QDialog, QLineEditor 등이 나타납니다.

Properties 창 아래를 보면 Signal/ Slot Editor 가 있습니다.



+ 를 눌러서 항목을 하나 선택 한 후 위 그림과 같이 설정해줍니다.

LineEditor textChanged(QString)LablesetText(QString) 를 연결했다는 뜻입니다.
이게 어떤 의미인 지는 미리보기를 실행하면 알 수 있습니다.

이제 ctrl + R 을 눌러서 미리보기를 실행해 보겠습니다.



Designer 창에서 편집한 대로 Dialog가 실행되고 있는 것을 볼 수 있습니다.
이제 LineEditor 에서 text를 입력해 보겠습니다.



LineEditor에서 입력한대로 Label 의 글자가 바뀌는 것을 볼 수 있습니다.

Signal / Slot을 연결했기 때문에 두 control이 연계되는 것을 확인 할 수 있습니다.
아직 python code를 한 글자도 입력하지 않았는데도 말이죠.

그 동안 편집한 것을 저장하면 .ui 라는 확장자로 저장됩니다.
내부 data는 xml 형식입니다.

Python GUI Programming : PyQt #00 설치

1. PyQt란 ?

PyQt는 Python GUI Package 중 하나 입니다.

Qt는 원래 C++ 용으로 개발된 GUI Package 입니다.
Qt의 원래 목적은 Platform에 상관없이 Qt를 이용해서 만든 GUI Program은 Windows / Linux / Mac 등에서 큰 수정없이 재사용이 가능하게 하는것입니다.
C++로 오랫동안 사용된 만큼 어마어마 한 양의 Reference가 잘 정리되어 있습니다.

하지만 주의해야 할 것이 License 입니다.

PyQt5 는 GPL 이므로, 회사나 기관, 개인 등의 특정 단체 내에서 사용하는데는 상관이 없지만,
해당 프로그램을 외부로 판매, 배포 등을 한다면 Source Code는 공개해야 합니다.
Source Code를 공개해야 한다는 것이지 돈받고 못판다는 것은 아닙니다.
PyQt4의 경우는 LGPL이라서 Source Code 공개 없이 판매가 가능합니다.
Nokia에서 추진한 PySide 같은 경우도 LPGL 입니다.

참고로 PyQt로 작성한 프로그램을 실행파일을 생성하여 배포할려면 PyQt5의 Python 3.4 에서는 문제가 좀 있습니다.
( 조만간 수정되리라 봅니다만 )
아직까지는 실행파일 생성에는 PyQt4의 Python 2.7을 사용해야 합니다.
하지만 Python 2.7의 지원이 곧 끝나므로 Python 3.4로 익히는 것을 추천드립니다.

2. PyQt Download 및 설치

Google에서 pyqt라고 검색하면 PyQt 사이트가 검색됩니다.

http://www.riverbankcomputing.com



PyQt5 의 Python 3.4 를 다운로드 받도록 하겠습니다.
Python 3.4가 PC에 설치되어 있어야 합니다.
설치된 Python과 같은 종류 (32/64 bit) 의 PyQt5를 Installer exe 파일로 다운로드 받으셔서 설치하시면 됩니다.



Windows 버전에서는 쉽게 클릭 몇번으로 설치가 가능합니다.
참고로 Ubuntu Linux 에서는 apt-get 을 이용하여 쉽게 설치가 가능합니다.
Mac에 설치시에는 Compile을 해야 하는 등 좀 복잡합니다.

3. 확인 및 초간단 예제 code

제대로 설치된지 확인 하기 위해서 짧은 예제 code를 생성해 보겠습니다.
아무 text editor를 열고 아래 code로 file을 생성합니다.


실행했을 경우 아래와 같이 창이 뜨면 제대로 설치된 것입니다.