2015년 11월 17일 화요일

pyodbc를 이용한 데이터 베이스

pyodbc를 이용한 간단한 데이터 베이스 접속및 쿼리를 수행 할 수 있다.

import pyodbc

ip = '127.0.0.1'
port = 20300
username = 'sys'
password = 'manager'
connstr = connstr = "DSN=ALTIBASE_SHARD;Server=%s;Port=%i;UID=%s;PWD=%s" % (ip, port, username, password)

dbconn = pyodbc.connect(connstr)
dbcursor = dbconn.cursor()

querystr = 'select * from t1'

dbcursor.execute(querystr)
rows = dbcursor.fetchall()

for row in rows:
    my_list.append(row)

데이터 베이스에 접속 해서 테이블을 셀릭트 해서 결과를 리스트에 받아 보는 예제 이다.

프로시져를 수행 하고 싶을 경우에는
'{call 프로시져명}'

의 형태의 쿼리문을 execute()메서드에 호출 해야 한다.

pyqt4 TableView컨트롤과 함께 이용하면 Query결과를 테이블뷰에 표시할 수 있다.

2015년 11월 13일 금요일

pyqt QTableView 다루기

QTableView 다루기

TableModel Class

QTDesigner에서 TableVirw 컨트롤을 디자인 한다.

이는 Table로 표시하는 (GRID) 컨트롤이다.

이를 다루기 위해서는 TableModel Class가 필요 하다.

code:

class MyTableModel(QAbstractTableModel):
    def __init__(self, parent, mylist, header, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.mylist = mylist
        self.header = header
    def rowCount(self, parent):
        return len(self.mylist)
    def columnCount(self, parent):
        #return len(self.mylist[0])
        return len(self.header)
    def data(self, index, role):
        if not index.isValid():
            return None
        elif role != Qt.DisplayRole:
            return None
        return self.mylist[index.row()][index.column()]
    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.header[col]
        return None
    def sort(self, col, order):
        """sort table by given column number col"""
        self.emit(SIGNAL("layoutAboutToBeChanged()"))
        self.mylist = sorted(self.mylist,
            key=operator.itemgetter(col))
        if order == Qt.DescendingOrder:
            self.mylist.reverse()
        self.emit(SIGNAL("layoutChanged()"))


위 코드는 일반적인 테이블뷰의 모델 클래스 이다.

list 형의 데이터로 헤더,와 데이터 를 파라메터로 주면 테이블이 표시 된다.

node_table_header = ['Node Name', ' Server IP', ' Server Port']

node_data_list = [
#('NDOE1','127.0.0.1',20300)
]

node_table_model = MyTableModel(self, node_data_list, node_table_header )


 self.tblViewNode.setModel(node_table_model)


위 코드는 tblViewNode (QTableView) 객체에 헤더만 구성된 빈 테이블 뷰를 표시한다.

node_data_list[]에 데이터가 체워지면 화면에 표시 될수 있다.

이벤트 핸들러

self.tblViewNode.doubleClicked.connect(self.btnChangeNodeClick)
위와 같이 더블 클릭시에 호출할 함수를 연결 할 수 있다.


편집 기능이 추가된 TableModel Class 만들기

    def flags(self, index):
        if index.column() == 1: #range만 편집 가능
            return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
        else:
            return Qt.ItemIsEnabled | Qt.ItemIsSelectable
TableModel Class에 위와 같은 함수를 추가 하면 두번째 컬럼 열은 편집 가능 한 cell 이 된다.
더블클릭을 하면 편집 모드로 진입 한다.

편집된 데이터는 data_list에 저장이 되어야 실제로 저장이 된다.
그러기 위해서는  setData 함수를 구현 해야 한다.

    def setData (self, index, variant, role=Qt.EditRole):
        if variant.toInt()[1] == True:
            self.mylist[index.row()][index.column()] = variant.toInt()[0]
        else:
            self.mylist[index.row()][index.column()] = 0
        return True

입력된 variant 값이 숫자형인 경우만 입력을 허용 하고 문자인 경우 0으로 대체 하는
예제이다.



pyqt evnet handler 연결 하기

QTDesigner를 이용하여 main폼을 디자인 한다.

이렇게 디자인된 button을 적당한 이름으로 적용 하여 .ui 파일을 생성 하고
이를 pyuic.py를 이용하여 파이썬 코드를 생성하면

main.py 파일이 생성되고
button 객체에 이름이 부여되어 생성 된다.

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(680, 543)
        self.btnAddNode = QtGui.QPushButton(self.layoutWidget)
        self.btnAddNode.setObjectName(_fromUtf8("btnAddNode"))

위 코드는 main.py 로 btnAddNode 라는 이름의 button이 디자인되어 있는
제너레이트된 코드에 일부이다.

이를 이용하는 코드 에서는

button이 눌렸을때 실행 해야할 코드를 작성하고 connect() 함수를 이용하여

아래에 코드처럼 이벤트 발생시 호출 할수 있도록 연결 해야 한다.

btnAddNodeClick() 함수가 연결된 함수이다.

code:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

from main import *

class TestApp (QMainWindow, Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.connect(self.btnAddNode, SIGNAL("clicked()"), self.btnAddNodeClick)

    def btnAddNodeClick(self):
        pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ShardGui()
    window.show()
    sys.exit(app.exec_())

python pyqt GUI 개발 - QTDesigner

https://github.com/sparrowapps/learn_python/blob/master/gui/QTDesigner.txt

QT Designer 사용하기
윈도우 ananconda 패키지에 경우
C:\Anaconda3\Lib\site-package\PyQt4
에 QT Designer 실행 파일이 존재 한다.
폼 , 다이얼로그를 이프로그램을 이용하여 디자인 하면
.ui 파일이 생성된다.
.ui파일은 xml 형식으로 되어 있다.
이를 바로 python에서 로드하여 사용 하는 방법도 있다.
하지만 이렇게 생성된 파일을 python 소스 코드로 변환 하여 바로 소스로 이용하는 방법이 있다.
C:\Anaconda3\Lib\site-package\PyQt4\uic
pyuic.py 파일을 이용하면 된다.
python C:\Anaconda3\Lib\site-packages\PyQt4\uic\pyuic.py -x about.ui -o about.py
about.ui 파일을 about.py 파이썬 소스 코드로 변환 시킨다.

Mac OS ananconda package를 사용하는 경우 QT Designer
/Users/계정명/anaconda/bin
에 Designer.app으로 존재 한다.
pyuic.py 모듈 위치
/Users/계정명/anaconda/pkgs/pyqt-4.11.3-py34_0/lib/python3.4/site-packages/PyQt4/uic
같은 방법으로 리소르를 빌드 해서 클래스모듈로 변환 하여 사용 가능 하다.

OS X에 별도로 python 및 PyQt4를 설치 한경우
OS X python install
http://python-guide-kr.readthedocs.org/ko/latest/starting/install/osx.html
python , homebrew
#brew install qt
#brew install sip
#brew install pyqt
http://download.qt.io/archive/qt/4.8/4.8.6/
에서 qt creator를 설치 하여 qt designer를 사용 할 수 있다.
디자인한 UI는 .ui 파일로 저장되고 python 용 uic를 이용하여 .py 코드를 얻을수 있다.
pyuic사용 방법
sparrow:/usr/local/Cellar/pyqt/4.11.3/lib/python2.7/site-packages/PyQt4 sparrow$ python ./uic/pyuic.py -x hello.ui -o hello.py