self.simulation_dt,
File "c:\zipline-0.9.0\zipline\utils\events.py", line 209, in handle_data
context.trading_environment,
File "c:\zipline-0.9.0\zipline\utils\events.py", line 228, in handle_data
self.callback(context, data)
File "c:\zipline-0.9.0\zipline\algorithm.py", line 368, in handle_data
self._handle_data(self, data)
File "C:\Users\Administrator\OneDrive\Developement\SystemT\systemt\backtesting
.py", line 62, in handle_data
ma5 = history(5, '1d', 'price').mean()
File "c:\zipline-0.9.0\zipline\utils\api_support.py", line 51, in wrapped
return getattr(get_algo_instance(), f.__name__)(*args, **kwargs)
File "c:\zipline-0.9.0\zipline\utils\api_support.py", line 98, in wrapped_meth
od
return method(self, *args, **kwargs)
File "c:\zipline-0.9.0\zipline\algorithm.py", line 1270, in history
return self.history_container.get_history(history_spec, self.datetime)
File "c:\zipline-0.9.0\zipline\history\history_container.py", line 904, in get
_history
raw=True
File "c:\zipline-0.9.0\zipline\history\history_container.py", line 56, in ffil
l_buffer_from_prior_values
nan_sids = pd.isnull(buffer_values[0])
IndexError: index 0 is out of bounds for axis 0 with size 0
Press any key to continue . . .
zipline 0.8.4
zipline 0.9.0
pandas_datareader를 이용해서 yahoo에서 AAPL 애플 주가를 얻은 다음
zipline 백테스팅 예제를 처리 하면 잘 동작 한다.
dataFrame에서 날짜 인덱스 부분을 UTC 시간으로 변경 하는 작업을 해주면 문제 없이 동작 한다.
하지만 국내 증시
나의 경우 직접 대신 증권 API를 통해서 일자별 시가, 고가, 저가, 종가를 얻어다가 DB를 구성 하고
이를 다시 로드 하여 dataframe을 구성해서
zipline에서 이용할 때 위와 같은 에러를 만났다.
대충 원인을 분석 하니 날짜 인덱스가 문제가 되는것으로 보인다.
그래서 pandas를 통해서 해당 종목을 yahoo에서 얻어서 처리를 해도 마찬가지 에러가 발생 한다.
우리나라 주식 거래일과 미쿡의 주식 거래일이 달라서 생기는 문제로 잠정 원인을 파악 했다.
그럼 해결방법은?
분석 시작 날짜로 부터 오늘의 데이터 까지를 대략 AAPL 즉 애플의 데이터 (미쿡 증시) 를 가져 온다음
종가 Adj Close 컬럼의 값을 실제로 내가 분석 하고 싶은 우리나라 종목에 종가로 교체 해 버리고
zipline을 처리 하니 동작 하더라
여기서 중요 포인트는 데이터 프레임의 개수를 맞추는 작업
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2016,7,15)
data = web.DataReader("AAPL", "yahoo", start, end)
data = data[['Adj Close']]
data.columns = [code]
data.head()
data = data.tz_localize("UTC")
df = makeDataFrame(code)
df = df[['CLOSE']]
data = data[len(data) - len(df):] #데이터 프레임의 row 수를 맞추는 작업
data[code] = np.where(1, df['CLOSE'], df['CLOSE']) #DB에서 가져온 df의 CLOSE 컬럼을 AAPL의 종가 컬럼으로 교체
zipline이 아직 개발 단계에 문제점이 많지만 간편하게 백테스팅을 처리 할 수 있는 좋은 라이브러리 같다.
2016년 7월 16일 토요일
2016년 7월 14일 목요일
주가 분석 , 이평선 골든 크로스, 볼린져 밴드 하단 터치 이후 상승, MACD signal Cross 종목 찾기
https://github.com/sparrowapps/systemt
2016년 7월 14일 골든 크로스 결과만 보자면
#-*- coding: utf-8 -*-
import pandas as pd
from pandas import Series, DataFrame
import sqlite3
import numpy as np
from logger import get_logger
from stockcode import get_code_list
from settings import START_DATE
from cp_constant import *
import win32com.client
def checkData( cursor, table_name ):
row = cursor.execute("SELECT 1 FROM sqlite_master WHERE type='table' AND name='{}'".format(table_name)).fetchone()
if row is None: return False
row = cursor.execute("SELECT COUNT(*) FROM '{}'".format(table_name)).fetchone()
if row is None : return False
return True
def makeDataFrame( code ):
with sqlite3.connect("price.db") as con:
cursor = con.cursor()
table_name = code
if checkData( cursor, table_name ) == False: return False
df = pd.read_sql("SELECT * FROM '{}'".format(table_name), con, index_col=None)
return df
def isMAGoldCross( df, MA1 = 20, MA2 = 60 ):
df['short_ma'] = pd.rolling_mean(df['CLOSE'],MA1)
df['long_ma'] = pd.rolling_mean(df['CLOSE'],MA2)
df['signal'] = 0.0
if len(df) < MA2 * 4 : return False
df['signal'][MA1:] = np.where(df['short_ma'][MA1:] > df['long_ma'][MA1:], 1.0, 0.0)
df['positions'] = 0.0
df['positions'] = df['signal'].diff()
if df['signal'][len(df)-1] == 1 and df['positions'][len(df)-1] == 1:
return True
else:
return False
def isBBandSignal( df, period = 20):
df['Bol_upper'] = pd.rolling_mean(df['CLOSE'], window=period) + 2* pd.rolling_std(df['CLOSE'], period, min_periods=period)
df['Bol_lower'] = pd.rolling_mean(df['CLOSE'], window=period) - 2* pd.rolling_std(df['CLOSE'], period, min_periods=period)
df['signal'] = 0.0
df['signal'] = np.where(df['Bol_lower'] > df['CLOSE'], 1.0, 0.0)
df['positions'] = 0.0
df['positions'] = df['signal'].diff()
if len(df) < 2: return False
if df['signal'][len(df)-2] == 1 and df['positions'][len(df)-2] == 1:
if df['signal'][len(df)-1] == 0 and df['positions'][len(df)-1] == -1.0:
return True
else:
return False
else:
return False
def isMACDSignal( df, n1 = 12, n2= 26, c= 9):
df['MACD'] = pd.ewma(df['CLOSE'], span=n1) - pd.ewma(df['CLOSE'], span=n2)
df['MACD_Signal'] = pd.ewma(df['MACD'], span=c)
df['signal'] = 0.0
df['signal'] = np.where(df['MACD'] < df['MACD_Signal'], 1.0, 0.0)
df['positions'] = 0.0
df['positions'] = df['signal'].diff()
if df['signal'][len(df)-1] == 1 and df['positions'][len(df)-1] == 1:
return True
else:
return False
def run():
with sqlite3.connect("analyze.db") as con:
cursor = con.cursor()
code_magc = {'CODE':[],
'NAME':[]}
code_bb = {'CODE':[],
'NAME':[]}
code_macd = {'CODE':[],
'NAME':[]}
for code, name in get_code_list():
df = makeDataFrame( code )
res = isMAGoldCross( df, 20, 60 )
if res == True:
code_magc['CODE'].append(code)
code_magc['NAME'].append(name)
get_logger().debug("MA20, MA60 Golden Cross {}{}".format(code,name))
res = isBBandSignal( df, 20 )
if res == True:
code_bb['CODE'].append(code)
code_bb['NAME'].append(name)
get_logger().debug("BBnad lower after up {}{}".format(code,name))
res = isMACDSignal( df, 12, 26, 9)
if res == True:
code_macd['CODE'].append(code)
code_macd['NAME'].append(name)
get_logger().debug("MACD sig {}{}".format(code,name))
magc = DataFrame(code_magc)
bb = DataFrame(code_bb)
macd = DataFrame(code_magc)
magc.to_sql("MAGC", con, if_exists='replace', chunksize=1000)
get_logger().debug("MAGC {} saved.".format(len(magc)))
bb.to_sql("BB", con, if_exists='replace', chunksize=1000)
get_logger().debug("BB {} saved.".format(len(bb)))
macd.to_sql("MACD", con, if_exists='replace', chunksize=1000)
get_logger().debug("MACD {} saved.".format(len(macd)))
if __name__ == '__main__':
run()
2016년 7월 14일 골든 크로스 결과만 보자면
sqlite> select * from MAGC;
0|A004560|현대비앤지스틸
1|A175330|JB금융지주
2|A004960|한신공영
3|A900110|이스트아시아홀딩스
4|A085310|엔케이
5|A000155|두산우
6|A016880|웅진
7|A059090|미코
8|A200780|비씨월드제약
9|A082740|두산엔진
10|A110570|넥솔론
11|A100030|모바일리더
12|A160550|NEW
13|A027050|코리아나
14|A083450|GST
15|A089600|나스미디어
16|A041440|에버다임
17|A200230|텔콘
18|A090990|코리아03호
19|A065440|이루온
20|A079650|서산
21|A008700|아남전자
22|A024120|KB오토시스
23|A050760|에스폴리텍
24|A008970|동양철관
sqlite>
네이버님의 골든크로스 결과보다 몇몇 종목이 더 나 왔다.
#-*- coding: utf-8 -*-
import pandas as pd
from pandas import Series, DataFrame
import sqlite3
import numpy as np
from logger import get_logger
from stockcode import get_code_list
from settings import START_DATE
from cp_constant import *
import win32com.client
def checkData( cursor, table_name ):
row = cursor.execute("SELECT 1 FROM sqlite_master WHERE type='table' AND name='{}'".format(table_name)).fetchone()
if row is None: return False
row = cursor.execute("SELECT COUNT(*) FROM '{}'".format(table_name)).fetchone()
if row is None : return False
return True
def makeDataFrame( code ):
with sqlite3.connect("price.db") as con:
cursor = con.cursor()
table_name = code
if checkData( cursor, table_name ) == False: return False
df = pd.read_sql("SELECT * FROM '{}'".format(table_name), con, index_col=None)
return df
def isMAGoldCross( df, MA1 = 20, MA2 = 60 ):
df['short_ma'] = pd.rolling_mean(df['CLOSE'],MA1)
df['long_ma'] = pd.rolling_mean(df['CLOSE'],MA2)
df['signal'] = 0.0
if len(df) < MA2 * 4 : return False
df['signal'][MA1:] = np.where(df['short_ma'][MA1:] > df['long_ma'][MA1:], 1.0, 0.0)
df['positions'] = 0.0
df['positions'] = df['signal'].diff()
if df['signal'][len(df)-1] == 1 and df['positions'][len(df)-1] == 1:
return True
else:
return False
def isBBandSignal( df, period = 20):
df['Bol_upper'] = pd.rolling_mean(df['CLOSE'], window=period) + 2* pd.rolling_std(df['CLOSE'], period, min_periods=period)
df['Bol_lower'] = pd.rolling_mean(df['CLOSE'], window=period) - 2* pd.rolling_std(df['CLOSE'], period, min_periods=period)
df['signal'] = 0.0
df['signal'] = np.where(df['Bol_lower'] > df['CLOSE'], 1.0, 0.0)
df['positions'] = 0.0
df['positions'] = df['signal'].diff()
if len(df) < 2: return False
if df['signal'][len(df)-2] == 1 and df['positions'][len(df)-2] == 1:
if df['signal'][len(df)-1] == 0 and df['positions'][len(df)-1] == -1.0:
return True
else:
return False
else:
return False
def isMACDSignal( df, n1 = 12, n2= 26, c= 9):
df['MACD'] = pd.ewma(df['CLOSE'], span=n1) - pd.ewma(df['CLOSE'], span=n2)
df['MACD_Signal'] = pd.ewma(df['MACD'], span=c)
df['signal'] = 0.0
df['signal'] = np.where(df['MACD'] < df['MACD_Signal'], 1.0, 0.0)
df['positions'] = 0.0
df['positions'] = df['signal'].diff()
if df['signal'][len(df)-1] == 1 and df['positions'][len(df)-1] == 1:
return True
else:
return False
def run():
with sqlite3.connect("analyze.db") as con:
cursor = con.cursor()
code_magc = {'CODE':[],
'NAME':[]}
code_bb = {'CODE':[],
'NAME':[]}
code_macd = {'CODE':[],
'NAME':[]}
for code, name in get_code_list():
df = makeDataFrame( code )
res = isMAGoldCross( df, 20, 60 )
if res == True:
code_magc['CODE'].append(code)
code_magc['NAME'].append(name)
get_logger().debug("MA20, MA60 Golden Cross {}{}".format(code,name))
res = isBBandSignal( df, 20 )
if res == True:
code_bb['CODE'].append(code)
code_bb['NAME'].append(name)
get_logger().debug("BBnad lower after up {}{}".format(code,name))
res = isMACDSignal( df, 12, 26, 9)
if res == True:
code_macd['CODE'].append(code)
code_macd['NAME'].append(name)
get_logger().debug("MACD sig {}{}".format(code,name))
magc = DataFrame(code_magc)
bb = DataFrame(code_bb)
macd = DataFrame(code_magc)
magc.to_sql("MAGC", con, if_exists='replace', chunksize=1000)
get_logger().debug("MAGC {} saved.".format(len(magc)))
bb.to_sql("BB", con, if_exists='replace', chunksize=1000)
get_logger().debug("BB {} saved.".format(len(bb)))
macd.to_sql("MACD", con, if_exists='replace', chunksize=1000)
get_logger().debug("MACD {} saved.".format(len(macd)))
if __name__ == '__main__':
run()
python pandas_datareader yahoo 파이낸스 삽질기
코스콤에서 주식 코드를 얻어다가 yahoo 파이넨스에 pandas를 이용해서 주가 데이터를
가져 와서 sqlite 데이터를 구축 하려고 했다.
이렇게 가져온 데이터를 다시 pandas 데이터 프레임으로 sqlite로 부터 읽어 들여 분석을
하면 이동평균선 골든 크로스 등을 찾아 낼 수 있을 거라 생각 했다.
그런데 이상하게 동원이란 종목이 분석에 문제를 일으킨다.
>>> import pandas_datareader.data as web
>>> df = web.DataReader("003580.KS", "yahoo", "2016/06/01", "2016/07/13")
>>> print (df)
Open High Low Close Volume Adj Close
Date
2016-06-01 1854 1854 1802 1814 45100 9070
2016-06-02 1866 1866 1804 1830 35200 9150
2016-06-03 1850 1874 1792 1854 31100 9270
2016-06-06 1854 1854 1854 1854 0 9270
2016-06-07 1840 1878 1822 1846 22900 9230
2016-06-08 1846 1846 1784 1814 26700 9070
2016-06-09 1780 1868 1780 1856 46500 9280
2016-06-10 1834 1870 1800 1832 20900 9160
2016-06-13 1800 1828 1772 1812 17700 9060
2016-06-14 1780 1800 1680 1758 25400 8790
2016-06-15 1740 1812 1724 1732 16600 8660
2016-06-16 1720 1788 1694 1730 16700 8650
2016-06-17 1730 1738 1602 1644 34900 8220
2016-06-20 1630 1670 1620 1638 29200 8190
2016-06-21 1650 1668 1638 1656 11300 8280
2016-06-22 1626 1696 1626 1660 7400 8300
2016-06-23 1632 1666 1630 1660 14000 8300
2016-06-24 1666 1676 1450 1550 77000 7750
2016-06-27 1486 1626 1482 1626 37600 8130
2016-06-28 1580 1694 1564 1690 32400 8450
2016-06-29 1688 1738 1622 1690 24000 8450
2016-06-30 1660 1762 1660 1762 35200 8810
2016-07-01 1762 1780 1726 1780 19600 8900
2016-07-04 1768 1790 1742 1760 6300 8800
2016-07-05 1734 1778 1732 1758 14100 8790
2016-07-06 1740 1740 1684 1720 14300 8600
2016-07-07 1780 1780 1702 1740 12900 8700
2016-07-08 1720 1784 1698 1740 24700 8700
2016-07-11 8400 8660 7630 8030 268800 40150
2016-07-12 7850 8400 7850 8350 106900 41750
2016-07-13 8500 8500 8250 8300 40000 41500
위에서 데이터를 보면 7월 8일 까지 1700원 때이던 데이터가 갑자기 8400원대로 변경 된다.
문제가 있다.
거래량도 갑자기 증가 한다.
야후 파이낸스에 데이터를 믿을수가 없다.
문제는 또한 KOSDAQ종목은 데이터가 없다.
이는 구글 파이낸스도 마찬가지다.
하여 결국 대신 증권 API를 이용해서 코드 부터 주식 과거 데이터를 구축 하는 코드로 변경 하였다.
야후 파이낸스도 믿을게 못된다.
2016년 4월 13일 수요일
mac pycharm + ananconda 환경 설정 하기
https://www.continuum.io/downloads
파이썬 패키지모음으로 ananconda가 있다.
os x 내장 파이썬은
파이썬 패키지모음으로 ananconda가 있다.
os x 내장 파이썬은
sparrow-mac-mini2:Versions sparrow$ ls
2.3 2.5 2.6 2.7 Current
sparrow-mac-mini2:Versions sparrow$ pwd
/System/Library/Frameworks/Python.framework/Versions
sparrow-mac-mini2:Versions sparrow$
이렇게 다양한 버젼이 설치 되어 있다.
ananconda 3.4 버젼을 설치 하고
https://www.jetbrains.com/pycharm/download/
무료 IDE CE 버젼을 내려 받을 수 있다.
Preference -> Project -> Project Interpreter
여기서 3.4 anaconda를 선택 하면 ananconda 파이썬을 인터프리터로 설정 하여 사용 할 수 있다.
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결과를 테이블뷰에 표시할 수 있다.
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 다루기
이는 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[]에 데이터가 체워지면 화면에 표시 될수 있다.
위와 같이 더블 클릭시에 호출할 함수를 연결 할 수 있다.
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으로 대체 하는
예제이다.
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_())
이렇게 디자인된 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
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
피드 구독하기:
글 (Atom)


