初次接触 PyQT, 鸣谢 散漫 童鞋 - Jacky Liu's Blog
初次接触 PyQT, 鸣谢 散漫 童鞋
---- 这是 散漫 童鞋昨天发给我的 PyQT4 演示脚本画出来的图片。他只发了绘图脚本却没发数据文件给我,所以我生造了一个数据文件。因为错拿日线数据当成日内数据作为输入,所以图里的内容看起来很无稽,但只要能把图画出来就可以了:
---- 发给我的脚本是跑在 windows 上面的,我在 ubuntu 下面改了一个 py2 版和一个 py3 版:
py2 版:
# -*- coding: utf-8 -*- #!/usr/bin/python import sys import random from PyQt4 import QtGui, QtCore,Qt class report_painter: '''绘制行情类''' def __init__(self,parent): #初始化 self.parent = parent self.paint = QtGui.QPainter() self.paint.begin(self.parent) #设置抗锯齿 #self.paint.setRenderHint(QtGui.QPainter.Antialiasing) #度量尺对象 self.metrics = self.paint.fontMetrics() #设置字体库 self.fonts = dict() self.fonts['default'] = QtGui.QFont('Serif', 9, QtGui.QFont.Light) self.fonts['yahei_14_bold']= QtGui.QFont('Serif',12,QtGui.QFont.Bold) self.fonts['yahei_14']= QtGui.QFont('Serif',12,QtGui.QFont.Light) self.setFont('default') #设置笔刷样式库 self.pens = dict() #红色 1px粗 1px点 2px距 线条 self.pens['red_1px_dashline'] = QtGui.QPen( QtCore.Qt.red, 1, QtCore.Qt.DashLine) self.pens['red_1px_dashline'].setDashPattern([1,2]) #红色 1px粗 实线条 self.pens['red'] = QtGui.QPen( QtCore.Qt.red, 1, QtCore.Qt.SolidLine) #红色 3px粗 实线条 self.pens['red_2px'] = QtGui.QPen( QtCore.Qt.red, 2, QtCore.Qt.SolidLine) #红色 2px粗 实线条 self.pens['red_3px'] = QtGui.QPen( QtCore.Qt.red, 3, QtCore.Qt.SolidLine) #黄色 1px粗 实线条 self.pens['yellow'] = QtGui.QPen( QtCore.Qt.yellow, 1, QtCore.Qt.SolidLine) #白色 1px粗 实线条 self.pens['white'] = QtGui.QPen( QtCore.Qt.white , 1, QtCore.Qt.SolidLine) #灰色 1px粗 实线条 self.pens['gray'] = QtGui.QPen( QtCore.Qt.gray, 1, QtCore.Qt.SolidLine) #绿色 1px粗 实线条 self.pens['green'] = QtGui.QPen( QtCore.Qt.green, 1, QtCore.Qt.SolidLine) #绿色 3px粗 实线条 self.pens['green_2px'] = QtGui.QPen( QtCore.Qt.green, 2, QtCore.Qt.SolidLine) #亮蓝 1px粗 1px点 2px距 线条 self.pens['cyan_1px_dashline'] = QtGui.QPen( QtCore.Qt.cyan, 1, QtCore.Qt.DashLine) self.pens['cyan_1px_dashline'].setDashPattern([3,2]) #获得窗口的长和宽 size = self.parent.size() self.w = size.width() self.h = size.height() #设置grid的上下左右补丁边距 self.grid_padding_left = 45 #左侧补丁边距 self.grid_padding_right = 245 #右侧补丁边距 self.grid_padding_top = 25 #顶部补丁边距 self.grid_padding_bottom = 17 #底部补丁边距 #开始绘制 self.start_paint() self.paint.end() #结束 '''绘制流程步骤''' def start_paint(self): self.PriceGridPaint() self.rightGridPaint() self.timelinePaint() self.topInfoPaint() self.rulerPaint() self.VolumeGridPaint() self.volumePaint() self.pricePaint() self.xyPaint() '''设置使用的字体''' def setFont(self,code='default'): self.paint.setFont(self.fonts[code]) '''设置使用的笔刷''' def setPen(self,code='default'): self.paint.setPen(self.pens[code]) '''绘制股价走势表格''' def PriceGridPaint(self): self.setPen('red') self.paint.setBrush(QtCore.Qt.NoBrush) sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_height = self.h-sum_height #画边框 self.paint.drawRect(self.grid_padding_left,self.grid_padding_top, self.w-sum_width,self.h-sum_height) #成交量和走势的分界线 self.paint.drawLine(self.grid_padding_left,grid_height*0.7+self.grid_padding_top, self.w-self.grid_padding_right,grid_height*0.7+self.grid_padding_top) #股票昨收中间线 self.paint.drawLine(self.grid_padding_left+1, grid_height*0.35+self.grid_padding_top, self.w-self.grid_padding_right ,grid_height*0.35+self.grid_padding_top) #其他线条 self.paint.drawLine(0,self.h-self.grid_padding_bottom,self.w-self.grid_padding_right+44,self.h-self.grid_padding_bottom) self.paint.drawLine(0,self.h-self.grid_padding_bottom+16,self.w,self.h-self.grid_padding_bottom+16) self.paint.drawLine(self.w-self.grid_padding_right,0, self.w-self.grid_padding_right,self.h-self.grid_padding_bottom+16) self.paint.drawLine(self.w-self.grid_padding_right+44,0, self.w-self.grid_padding_right+44,self.h-self.grid_padding_bottom+16) self.setPen('yellow') self.paint.drawText(self.w-self.grid_padding_right+5,self.h-self.grid_padding_bottom-4,QtCore.QString(u'成交量')) self.setPen('white') #右下角文字 self.paint.drawText(self.w-self.grid_padding_right+12,self.h-self.grid_padding_bottom+12,QtCore.QString(u'实时')) '''绘制成交量走势表格''' def VolumeGridPaint(self): sum_width = self.grid_padding_left + self.grid_padding_right sum_height = self.grid_padding_top + self.grid_padding_bottom grid_height = self.h-sum_height max_volume = self.parent.stk_data['max_vol'] px_h_radio = max_volume/(grid_height*0.3) self.setPen('red_1px_dashline') grid_num = 6 x = grid_num cnt = grid_height*0.3/grid_num for i in range(0,grid_num): self.setPen('red_1px_dashline') #计算坐标 y1 = self.grid_padding_top+(grid_height*0.7)+i*cnt x1 = self.grid_padding_left x2 = self.grid_padding_left+self.w-sum_width self.paint.drawLine(x1,y1,x2,y1) #画价位虚线 vol_int = int(cnt*x*px_h_radio) vol_str = str(vol_int) fw = self.metrics.width(vol_str) #获得文字宽度 fh = self.metrics.height()/2 #获得文字高度 self.setPen('yellow') self.paint.drawText(x2+40-fw,y1+fh,vol_str) #写入文字 self.setPen('white') self.paint.drawText(x1-2-self.metrics.width(str(x)),y1+fh,str(x)) #写入文字 x-=1 '''绘制左侧信息栏和盘口等内容''' def rightGridPaint(self): self.setPen('red') #绘制信息内容之间的分割线 _h = 0 _x = self.w-self.grid_padding_right+44 self.paint.drawLine(self.w-1,0,self.w-1,self.h-self.grid_padding_bottom+16) self.paint.drawLine(0,0,0,self.h-self.grid_padding_bottom+16) self.paint.drawLine(0,_h,self.w,_h) _h+=23 self.paint.drawLine(_x,_h,self.w,_h) _h+=24 self.paint.drawLine(_x,_h,self.w,_h) _h+=93 self.paint.drawLine(_x,_h,self.w,_h) _h+=20 self.paint.drawLine(_x,_h,self.w,_h) _h+=93 self.paint.drawLine(_x,_h,self.w,_h) _h+=123 self.paint.drawLine(_x,_h,self.w,_h) _h+=23 self.paint.drawLine(_x,_h,self.w,_h) #股票名称和代码 self.setFont('yahei_14_bold') self.setPen('yellow') name_str = QtCore.QString(u'%s %s'%(self.parent.stk_info['code'],self.parent.stk_info['name'])) self.paint.drawText(_x+35,18,name_str) #委比和委差 self.setFont('yahei_14') zx_str = QtCore.QString(u'最新') self.paint.drawText(_x+3 ,156,zx_str) self.setPen('gray') wb_str = QtCore.QString(u'委比') wc_str = QtCore.QString(u'委差') xs_str = QtCore.QString(u'现手') self.paint.drawText(_x+3 ,39,wb_str) self.paint.drawText(_x+100,39,wc_str) self.paint.drawText(_x+100,156,xs_str) fh = self.metrics.height() left_field_list = [u'涨跌',u'涨幅',u'振幅',u'总手',u'总额',u'换手',u'分笔'] i = 1 for field in left_field_list: field_str = QtCore.QString(field) self.paint.drawText(_x+3,253+(i*17),field_str) i+=1 right_field_list = [u'均价',u'前收',u'今开',u'最高',u'最低',u'量比',u'均量'] i = 1 for field in right_field_list: field_str = QtCore.QString(field) self.paint.drawText(_x+100,253+(i*17),field_str) i+=1 wp_str = QtCore.QString(u'外盘') np_str = QtCore.QString(u'内盘') self.paint.drawText(_x+3,395,wp_str) self.paint.drawText(_x+100,395,np_str) #卖①②③④⑤ i = 0 sell_queue = [u'卖⑤',u'卖④',u'卖③',u'卖②',u'卖①'] for sell in sell_queue: sell_str = QtCore.QString(sell) self.paint.drawText(_x+3,62+(i*18),sell_str) i+=1 #买①②③④⑤ buy_queue = [u'买①',u'买②',u'买③',u'买④',u'买⑤'] for buy in buy_queue: buy_str = QtCore.QString(buy) self.paint.drawText(_x+3,87+(i*18),buy_str) i+=1 self.setPen('red_2px') self.paint.drawLine(_x+1,377,_x+99,377) self.paint.drawLine(_x+1,46,_x+65,46) self.setPen('green_2px') self.paint.drawLine(_x+102,377,_x+199,377) self.paint.drawLine(_x+67,46,_x+199,46) self.setFont('default') '''绘制左右侧的价格刻度''' def rulerPaint(self): sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_height = self.h-sum_height high = self.parent.stk_data['high'] low = self.parent.stk_data['low'] lastclose = self.parent.stk_data['lastclose'] top = high-lastclose bottom = lastclose-low if top>bottom: padding = top else: padding = bottom limit_top = lastclose+padding limit_low = lastclose-padding px_h_radio = (grid_height*0.7)/((limit_top-limit_low)*100) self.setPen('red_1px_dashline') grid_num = 16 cnt = grid_height*0.7/grid_num for i in range(0,grid_num): self.setPen('red_1px_dashline') #计算坐标 y1 = self.grid_padding_top+i*cnt x1 = self.grid_padding_left x2 = self.grid_padding_left+self.w-sum_width self.paint.drawLine(x1,y1,x2,y1) #画价位虚线 price_float = (limit_top - ((i*cnt)/px_h_radio/100)) #计算价格 price = '%4.2f'%(price_float) #格式化价格成str fw = self.metrics.width(price) #获得文字宽度 fh = self.metrics.height()/2 #获得文字高度 radio_float = (price_float/lastclose-1)*100 #计算波动百分比 radio_str = "%2.2f%%"%(radio_float) #格式化百分比成str r_fw = self.metrics.width(radio_str) r_fh = self.metrics.height()/2 #判断文字使用的颜色 if price_float == lastclose: self.setPen('white') if price_float < lastclose: self.setPen('green') self.paint.drawText(x1-fw-2,y1+fh,price) #写入文字 self.paint.drawText(x2+40-r_fw,y1+r_fh,radio_str) #写入文字 '''绘制x,y准星''' def xyPaint(self): if self.parent.m_x >= self.grid_padding_left and self.parent.m_x<=self.w-self.grid_padding_right and self.parent.m_y>=self.grid_padding_top and self.parent.m_y<=self.h-self.grid_padding_bottom: self.setPen('gray') x1 = self.grid_padding_left x2 = self.w-self.grid_padding_right y1 = self.grid_padding_top y2 = self.h-self.grid_padding_bottom self.paint.drawLine(x1+1,self.parent.m_y,x2-1,self.parent.m_y) self.paint.drawLine(self.parent.m_x,y1+1,self.parent.m_x,y2-1) '''绘制时间轴刻度''' def timelinePaint(self): fw = self.metrics.width(u'00:00') #计算文字的宽度 sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_width = self.w-sum_width-2 y1 = self.grid_padding_top y2 = y1+(self.h-sum_height) #时间轴中线 self.setPen('red') x_pos = grid_width/2+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) self.paint.drawText(x_pos-fw/2,y2+12,QtCore.QString(u'13:00')) #时间轴09点30分 x_pos = self.grid_padding_left self.paint.drawText(x_pos,y2+12,QtCore.QString(u'09:30')) #时间轴10点30分 x_pos = grid_width*0.25+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) self.paint.drawText(x_pos-fw/2,y2+12,QtCore.QString(u'10:30')) #时间轴14点00分 x_pos = grid_width*0.75+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) self.paint.drawText(x_pos-fw/2,y2+12,QtCore.QString(u'14:00')) #时间轴15点00分 x_pos = grid_width+self.grid_padding_left self.paint.drawText(x_pos-fw,y2+12,QtCore.QString(u'15:00')) #时间虚线 by 30min self.setPen('red_1px_dashline') x_pos_array = [0.125,0.375,0.625,0.875] for i in x_pos_array: x_pos = grid_width*i+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) '''绘制表格上方的股票信息''' def topInfoPaint(self): self.setPen('yellow') self.paint.drawText(4+self.grid_padding_left,self.grid_padding_top-4 ,QtCore.QString(self.parent.stk_info['name'])) #股票名称 self.paint.drawText(4+self.grid_padding_left+120,self.grid_padding_top-4 ,QtCore.QString(u'均价线:')) #均价线 lastclose = self.parent.stk_data['lastclose'] close = self.parent.stk_data['close'] mma = self.parent.stk_data['list']['mma'][-1] if lastclose>close: self.setPen('green') str_1 = '%.2f -%.2f'%(close,lastclose-close) if lastclose==close: self.setPen('white') str_1 = '%.2f +%.2f'%(close,0.00) if lastclose<close: self.setPen('red') str_1 = '%.2f +%.2f'%(close,close-lastclose) if mma>close: self.setPen('green') if mma==close: self.setPen('white') if mma<close: self.setPen('red') self.paint.drawText(4+self.grid_padding_left+55,self.grid_padding_top-4,QtCore.QString(str_1)) self.paint.drawText(4+self.grid_padding_left+165,self.grid_padding_top-4,QtCore.QString('%.2f'%mma)) #均价 #涨停价 self.setPen('red') self.paint.drawText(4+self.grid_padding_left+200,self.grid_padding_top-4,QtCore.QString(u'涨停价:%.2f'%(lastclose*1.1))) #均价 #跌停价 self.setPen('green') self.paint.drawText(4+self.grid_padding_left+280,self.grid_padding_top-4,QtCore.QString(u'跌停价:%.2f'%(lastclose*0.9))) #均价 '''绘制股价走势''' def pricePaint(self): sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_height = self.h-sum_height-2 high = self.parent.stk_data['high'] low = self.parent.stk_data['low'] lastclose = self.parent.stk_data['lastclose'] top = high-lastclose bottom = lastclose-low if top>bottom: padding = top else: padding = bottom limit_top = lastclose+padding limit_low = lastclose-padding h_radio = (grid_height*0.7)/((limit_top-limit_low)*100) w_radio = (self.w-sum_width-2)/240.00 w = self.grid_padding_left self.setPen('white') path = QtGui.QPainterPath() path.moveTo(w,(limit_top-self.parent.stk_data['open'])*100*h_radio+self.grid_padding_top) i = 1 for price in self.parent.stk_data['list']['close']: w = i*w_radio+self.grid_padding_left y = (limit_top-price)*100*h_radio+self.grid_padding_top path.lineTo(w,y) i+=1 self.paint.drawPath(path) self.setPen('cyan_1px_dashline') self.paint.drawLine(self.grid_padding_left+1,y,w-1,y) self.setPen('yellow') path = QtGui.QPainterPath() w = self.grid_padding_left path.moveTo(w,(limit_top-self.parent.stk_data['open'])*100*h_radio+self.grid_padding_top) i = 1 for price in self.parent.stk_data['list']['mma']: w = i*w_radio+self.grid_padding_left y = (limit_top-price)*100*h_radio+self.grid_padding_top path.lineTo(w,y) i+=1 self.paint.drawPath(path) '''绘制成交量''' def volumePaint(self): sum_width = self.grid_padding_left + self.grid_padding_right sum_height = self.grid_padding_top + self.grid_padding_bottom max_volume = self.parent.stk_data['max_vol'] #最大分钟成交量 w_radio = (self.w-sum_width-2)/240.00 h_radio = ((self.h-sum_height-2)*0.3)/max_volume y = (self.h-sum_height)+self.grid_padding_top self.setPen('yellow') for i in range(1,len(self.parent.stk_data['list']['vol'])+1): x = i*w_radio+self.grid_padding_left y2 = h_radio*self.parent.stk_data['list']['vol'][i-1] self.paint.drawLine(x,y-1,x,y-y2) class Test(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setMinimumSize(640, 430) #设置窗口最小尺寸 self.setGeometry(300, 300, 960, 650) self.setWindowTitle(QtCore.QString(u'超级狙击手[内部开发测试版]-行情实时走势')) self.setStyleSheet("QWidget { background-color: black }") self.setWindowIcon(QtGui.QIcon('ruby.png')) self.setMouseTracking(True) self.m_x = 0 #光标x轴位置 self.m_y = 0 #光标y轴位置 self.stk_info = {} self.stk_info['name'] = u'浙江东方' self.stk_info['code'] = u'600120' self.stk_info['market'] = 'SH' self.stk_data = {} self.stk_data['list'] = {} #股价序列 self.stk_data['list']['time'] = [] #时间 self.stk_data['list']['open'] = [] #开盘价 self.stk_data['list']['high'] = [] #最高价 self.stk_data['list']['low'] = [] #最低价 self.stk_data['list']['close'] = [] #收盘价 self.stk_data['list']['vol'] = [] #成交量 self.stk_data['list']['amount']= [] #成交额 self.stk_data['list']['mma']= [] #分时均价 self.stk_data['list']['buy_port'] = [(0.00,0),(0.00,0),(0.00,0),(0.00,0),(0.00,0)] #买盘前五 self.stk_data['list']['sell_port'] = [(0.00,0),(0.00,0),(0.00,0),(0.00,0),(0.00,0)] #卖盘前五 #读取数据 f = open('SH600120.txt','r') data = f.readlines() f.close() for row in data: vars = row.split(' ') self.stk_data['list']['time'].append(vars[1]) self.stk_data['list']['open'].append(float(vars[2])) self.stk_data['list']['high'].append(float(vars[3])) self.stk_data['list']['low'].append(float(vars[4])) self.stk_data['list']['close'].append(float(vars[5])) self.stk_data['list']['vol'].append(int(float(vars[6]))) self.stk_data['list']['amount'].append(int(float(vars[7]))) sum_vol = sum(self.stk_data['list']['vol']) sum_amt = sum(self.stk_data['list']['amount']) self.stk_data['list']['mma'].append(float(sum_amt)/(sum_vol*100.00)) self.stk_data['lastclose'] = 10.12 #上一个交易日收盘价 self.stk_data['open'] = self.stk_data['list']['open'][0] #开盘价 self.stk_data['high'] = max(self.stk_data['list']['high']) #最高价 self.stk_data['low'] = min(self.stk_data['list']['low']) #最低价 self.stk_data['close']= self.stk_data['list']['close'][-1] #收盘价 self.stk_data['max_vol'] = max(self.stk_data['list']['vol']) #当日最高成交量 def mouseMoveEvent(self, event): self.m_x = int(event.x()) self.m_y = int(event.y()) self.repaint() def paintEvent(self, event): report_painter(self) app = QtGui.QApplication(sys.argv) dt = Test() dt.show() app.exec_()
py3 版:
# -*- coding: utf-8 -*- #!/usr/bin/python import sys import random from PyQt4 import QtGui, QtCore,Qt class report_painter: '''绘制行情类''' def __init__(self,parent): #初始化 self.parent = parent self.paint = QtGui.QPainter() self.paint.begin(self.parent) #设置抗锯齿 #self.paint.setRenderHint(QtGui.QPainter.Antialiasing) #度量尺对象 self.metrics = self.paint.fontMetrics() #设置字体库 self.fonts = dict() self.fonts['default'] = QtGui.QFont('Serif', 9, QtGui.QFont.Light) self.fonts['yahei_14_bold']= QtGui.QFont('Serif',12,QtGui.QFont.Bold) self.fonts['yahei_14']= QtGui.QFont('Serif',12,QtGui.QFont.Light) self.setFont('default') #设置笔刷样式库 self.pens = dict() #红色 1px粗 1px点 2px距 线条 self.pens['red_1px_dashline'] = QtGui.QPen( QtCore.Qt.red, 1, QtCore.Qt.DashLine) self.pens['red_1px_dashline'].setDashPattern([1,2]) #红色 1px粗 实线条 self.pens['red'] = QtGui.QPen( QtCore.Qt.red, 1, QtCore.Qt.SolidLine) #红色 3px粗 实线条 self.pens['red_2px'] = QtGui.QPen( QtCore.Qt.red, 2, QtCore.Qt.SolidLine) #红色 2px粗 实线条 self.pens['red_3px'] = QtGui.QPen( QtCore.Qt.red, 3, QtCore.Qt.SolidLine) #黄色 1px粗 实线条 self.pens['yellow'] = QtGui.QPen( QtCore.Qt.yellow, 1, QtCore.Qt.SolidLine) #白色 1px粗 实线条 self.pens['white'] = QtGui.QPen( QtCore.Qt.white , 1, QtCore.Qt.SolidLine) #灰色 1px粗 实线条 self.pens['gray'] = QtGui.QPen( QtCore.Qt.gray, 1, QtCore.Qt.SolidLine) #绿色 1px粗 实线条 self.pens['green'] = QtGui.QPen( QtCore.Qt.green, 1, QtCore.Qt.SolidLine) #绿色 3px粗 实线条 self.pens['green_2px'] = QtGui.QPen( QtCore.Qt.green, 2, QtCore.Qt.SolidLine) #亮蓝 1px粗 1px点 2px距 线条 self.pens['cyan_1px_dashline'] = QtGui.QPen( QtCore.Qt.cyan, 1, QtCore.Qt.DashLine) self.pens['cyan_1px_dashline'].setDashPattern([3,2]) #获得窗口的长和宽 size = self.parent.size() self.w = size.width() self.h = size.height() #设置grid的上下左右补丁边距 self.grid_padding_left = 45 #左侧补丁边距 self.grid_padding_right = 245 #右侧补丁边距 self.grid_padding_top = 25 #顶部补丁边距 self.grid_padding_bottom = 17 #底部补丁边距 #开始绘制 self.start_paint() self.paint.end() #结束 '''绘制流程步骤''' def start_paint(self): self.PriceGridPaint() self.rightGridPaint() self.timelinePaint() self.topInfoPaint() self.rulerPaint() self.VolumeGridPaint() self.volumePaint() self.pricePaint() self.xyPaint() '''设置使用的字体''' def setFont(self,code='default'): self.paint.setFont(self.fonts[code]) '''设置使用的笔刷''' def setPen(self,code='default'): self.paint.setPen(self.pens[code]) '''绘制股价走势表格''' def PriceGridPaint(self): self.setPen('red') self.paint.setBrush(QtCore.Qt.NoBrush) sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_height = self.h-sum_height #画边框 self.paint.drawRect(self.grid_padding_left,self.grid_padding_top, self.w-sum_width,self.h-sum_height) #成交量和走势的分界线 self.paint.drawLine(self.grid_padding_left,grid_height*0.7+self.grid_padding_top, self.w-self.grid_padding_right,grid_height*0.7+self.grid_padding_top) #股票昨收中间线 self.paint.drawLine(self.grid_padding_left+1, grid_height*0.35+self.grid_padding_top, self.w-self.grid_padding_right ,grid_height*0.35+self.grid_padding_top) #其他线条 self.paint.drawLine(0,self.h-self.grid_padding_bottom,self.w-self.grid_padding_right+44,self.h-self.grid_padding_bottom) self.paint.drawLine(0,self.h-self.grid_padding_bottom+16,self.w,self.h-self.grid_padding_bottom+16) self.paint.drawLine(self.w-self.grid_padding_right,0, self.w-self.grid_padding_right,self.h-self.grid_padding_bottom+16) self.paint.drawLine(self.w-self.grid_padding_right+44,0, self.w-self.grid_padding_right+44,self.h-self.grid_padding_bottom+16) self.setPen('yellow') self.paint.drawText(self.w-self.grid_padding_right+5,self.h-self.grid_padding_bottom-4,str('成交量')) self.setPen('white') #右下角文字 self.paint.drawText(self.w-self.grid_padding_right+12,self.h-self.grid_padding_bottom+12,str('实时')) '''绘制成交量走势表格''' def VolumeGridPaint(self): sum_width = self.grid_padding_left + self.grid_padding_right sum_height = self.grid_padding_top + self.grid_padding_bottom grid_height = self.h-sum_height max_volume = self.parent.stk_data['max_vol'] px_h_radio = max_volume/(grid_height*0.3) self.setPen('red_1px_dashline') grid_num = 6 x = grid_num cnt = grid_height*0.3/grid_num for i in range(0,grid_num): self.setPen('red_1px_dashline') #计算坐标 y1 = self.grid_padding_top+(grid_height*0.7)+i*cnt x1 = self.grid_padding_left x2 = self.grid_padding_left+self.w-sum_width self.paint.drawLine(x1,y1,x2,y1) #画价位虚线 vol_int = int(cnt*x*px_h_radio) vol_str = str(vol_int) fw = self.metrics.width(vol_str) #获得文字宽度 fh = self.metrics.height()/2 #获得文字高度 self.setPen('yellow') self.paint.drawText(x2+40-fw,y1+fh,vol_str) #写入文字 self.setPen('white') self.paint.drawText(x1-2-self.metrics.width(str(x)),y1+fh,str(x)) #写入文字 x-=1 '''绘制左侧信息栏和盘口等内容''' def rightGridPaint(self): self.setPen('red') #绘制信息内容之间的分割线 _h = 0 _x = self.w-self.grid_padding_right+44 self.paint.drawLine(self.w-1,0,self.w-1,self.h-self.grid_padding_bottom+16) self.paint.drawLine(0,0,0,self.h-self.grid_padding_bottom+16) self.paint.drawLine(0,_h,self.w,_h) _h+=23 self.paint.drawLine(_x,_h,self.w,_h) _h+=24 self.paint.drawLine(_x,_h,self.w,_h) _h+=93 self.paint.drawLine(_x,_h,self.w,_h) _h+=20 self.paint.drawLine(_x,_h,self.w,_h) _h+=93 self.paint.drawLine(_x,_h,self.w,_h) _h+=123 self.paint.drawLine(_x,_h,self.w,_h) _h+=23 self.paint.drawLine(_x,_h,self.w,_h) #股票名称和代码 self.setFont('yahei_14_bold') self.setPen('yellow') name_str = str('%s %s'%(self.parent.stk_info['code'],self.parent.stk_info['name'])) self.paint.drawText(_x+35,18,name_str) #委比和委差 self.setFont('yahei_14') zx_str = str('最新') self.paint.drawText(_x+3 ,156,zx_str) self.setPen('gray') wb_str = str('委比') wc_str = str('委差') xs_str = str('现手') self.paint.drawText(_x+3 ,39,wb_str) self.paint.drawText(_x+100,39,wc_str) self.paint.drawText(_x+100,156,xs_str) fh = self.metrics.height() left_field_list = ['涨跌','涨幅','振幅','总手','总额','换手','分笔'] i = 1 for field in left_field_list: field_str = str(field) self.paint.drawText(_x+3,253+(i*17),field_str) i+=1 right_field_list = ['均价','前收','今开','最高','最低','量比','均量'] i = 1 for field in right_field_list: field_str = str(field) self.paint.drawText(_x+100,253+(i*17),field_str) i+=1 wp_str = str('外盘') np_str = str('内盘') self.paint.drawText(_x+3,395,wp_str) self.paint.drawText(_x+100,395,np_str) #卖①②③④⑤ i = 0 sell_queue = ['卖⑤','卖④','卖③','卖②','卖①'] for sell in sell_queue: sell_str = str(sell) self.paint.drawText(_x+3,62+(i*18),sell_str) i+=1 #买①②③④⑤ buy_queue = ['买①','买②','买③','买④','买⑤'] for buy in buy_queue: buy_str = str(buy) self.paint.drawText(_x+3,87+(i*18),buy_str) i+=1 self.setPen('red_2px') self.paint.drawLine(_x+1,377,_x+99,377) self.paint.drawLine(_x+1,46,_x+65,46) self.setPen('green_2px') self.paint.drawLine(_x+102,377,_x+199,377) self.paint.drawLine(_x+67,46,_x+199,46) self.setFont('default') '''绘制左右侧的价格刻度''' def rulerPaint(self): sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_height = self.h-sum_height high = self.parent.stk_data['high'] low = self.parent.stk_data['low'] lastclose = self.parent.stk_data['lastclose'] top = high-lastclose bottom = lastclose-low if top>bottom: padding = top else: padding = bottom limit_top = lastclose+padding limit_low = lastclose-padding px_h_radio = (grid_height*0.7)/((limit_top-limit_low)*100) self.setPen('red_1px_dashline') grid_num = 16 cnt = grid_height*0.7/grid_num for i in range(0,grid_num): self.setPen('red_1px_dashline') #计算坐标 y1 = self.grid_padding_top+i*cnt x1 = self.grid_padding_left x2 = self.grid_padding_left+self.w-sum_width self.paint.drawLine(x1,y1,x2,y1) #画价位虚线 price_float = (limit_top - ((i*cnt)/px_h_radio/100)) #计算价格 price = '%4.2f'%(price_float) #格式化价格成str fw = self.metrics.width(price) #获得文字宽度 fh = self.metrics.height()/2 #获得文字高度 radio_float = (price_float/lastclose-1)*100 #计算波动百分比 radio_str = "%2.2f%%"%(radio_float) #格式化百分比成str r_fw = self.metrics.width(radio_str) r_fh = self.metrics.height()/2 #判断文字使用的颜色 if price_float == lastclose: self.setPen('white') if price_float < lastclose: self.setPen('green') self.paint.drawText(x1-fw-2,y1+fh,price) #写入文字 self.paint.drawText(x2+40-r_fw,y1+r_fh,radio_str) #写入文字 '''绘制x,y准星''' def xyPaint(self): if self.parent.m_x >= self.grid_padding_left and self.parent.m_x<=self.w-self.grid_padding_right and self.parent.m_y>=self.grid_padding_top and self.parent.m_y<=self.h-self.grid_padding_bottom: self.setPen('gray') x1 = self.grid_padding_left x2 = self.w-self.grid_padding_right y1 = self.grid_padding_top y2 = self.h-self.grid_padding_bottom self.paint.drawLine(x1+1,self.parent.m_y,x2-1,self.parent.m_y) self.paint.drawLine(self.parent.m_x,y1+1,self.parent.m_x,y2-1) '''绘制时间轴刻度''' def timelinePaint(self): fw = self.metrics.width('00:00') #计算文字的宽度 sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_width = self.w-sum_width-2 y1 = self.grid_padding_top y2 = y1+(self.h-sum_height) #时间轴中线 self.setPen('red') x_pos = grid_width/2+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) self.paint.drawText(x_pos-fw/2,y2+12,str('13:00')) #时间轴09点30分 x_pos = self.grid_padding_left self.paint.drawText(x_pos,y2+12,str('09:30')) #时间轴10点30分 x_pos = grid_width*0.25+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) self.paint.drawText(x_pos-fw/2,y2+12,str('10:30')) #时间轴14点00分 x_pos = grid_width*0.75+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) self.paint.drawText(x_pos-fw/2,y2+12,str('14:00')) #时间轴15点00分 x_pos = grid_width+self.grid_padding_left self.paint.drawText(x_pos-fw,y2+12,str('15:00')) #时间虚线 by 30min self.setPen('red_1px_dashline') x_pos_array = [0.125,0.375,0.625,0.875] for i in x_pos_array: x_pos = grid_width*i+self.grid_padding_left self.paint.drawLine(x_pos,y1,x_pos,y2) '''绘制表格上方的股票信息''' def topInfoPaint(self): self.setPen('yellow') self.paint.drawText(4+self.grid_padding_left,self.grid_padding_top-4 ,str(self.parent.stk_info['name'])) #股票名称 self.paint.drawText(4+self.grid_padding_left+120,self.grid_padding_top-4 ,str('均价线:')) #均价线 lastclose = self.parent.stk_data['lastclose'] close = self.parent.stk_data['close'] mma = self.parent.stk_data['list']['mma'][-1] if lastclose>close: self.setPen('green') str_1 = '%.2f -%.2f'%(close,lastclose-close) if lastclose==close: self.setPen('white') str_1 = '%.2f +%.2f'%(close,0.00) if lastclose<close: self.setPen('red') str_1 = '%.2f +%.2f'%(close,close-lastclose) if mma>close: self.setPen('green') if mma==close: self.setPen('white') if mma<close: self.setPen('red') self.paint.drawText(4+self.grid_padding_left+55,self.grid_padding_top-4,str(str_1)) self.paint.drawText(4+self.grid_padding_left+165,self.grid_padding_top-4,str('%.2f'%mma)) #均价 #涨停价 self.setPen('red') self.paint.drawText(4+self.grid_padding_left+200,self.grid_padding_top-4,str('涨停价:%.2f'%(lastclose*1.1))) #均价 #跌停价 self.setPen('green') self.paint.drawText(4+self.grid_padding_left+280,self.grid_padding_top-4,str('跌停价:%.2f'%(lastclose*0.9))) #均价 '''绘制股价走势''' def pricePaint(self): sum_width = self.grid_padding_left+self.grid_padding_right sum_height = self.grid_padding_top+self.grid_padding_bottom grid_height = self.h-sum_height-2 high = self.parent.stk_data['high'] low = self.parent.stk_data['low'] lastclose = self.parent.stk_data['lastclose'] top = high-lastclose bottom = lastclose-low if top>bottom: padding = top else: padding = bottom limit_top = lastclose+padding limit_low = lastclose-padding h_radio = (grid_height*0.7)/((limit_top-limit_low)*100) w_radio = (self.w-sum_width-2)/240.00 w = self.grid_padding_left self.setPen('white') path = QtGui.QPainterPath() path.moveTo(w,(limit_top-self.parent.stk_data['open'])*100*h_radio+self.grid_padding_top) i = 1 for price in self.parent.stk_data['list']['close']: w = i*w_radio+self.grid_padding_left y = (limit_top-price)*100*h_radio+self.grid_padding_top path.lineTo(w,y) i+=1 self.paint.drawPath(path) self.setPen('cyan_1px_dashline') self.paint.drawLine(self.grid_padding_left+1,y,w-1,y) self.setPen('yellow') path = QtGui.QPainterPath() w = self.grid_padding_left path.moveTo(w,(limit_top-self.parent.stk_data['open'])*100*h_radio+self.grid_padding_top) i = 1 for price in self.parent.stk_data['list']['mma']: w = i*w_radio+self.grid_padding_left y = (limit_top-price)*100*h_radio+self.grid_padding_top path.lineTo(w,y) i+=1 self.paint.drawPath(path) '''绘制成交量''' def volumePaint(self): sum_width = self.grid_padding_left + self.grid_padding_right sum_height = self.grid_padding_top + self.grid_padding_bottom max_volume = self.parent.stk_data['max_vol'] #最大分钟成交量 w_radio = (self.w-sum_width-2)/240.00 h_radio = ((self.h-sum_height-2)*0.3)/max_volume y = (self.h-sum_height)+self.grid_padding_top self.setPen('yellow') for i in range(1,len(self.parent.stk_data['list']['vol'])+1): x = i*w_radio+self.grid_padding_left y2 = h_radio*self.parent.stk_data['list']['vol'][i-1] self.paint.drawLine(x,y-1,x,y-y2) class Test(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setMinimumSize(640, 430) #设置窗口最小尺寸 self.setGeometry(300, 300, 960, 650) self.setWindowTitle(str('超级狙击手[内部开发测试版]-行情实时走势')) self.setStyleSheet("QWidget { background-color: black }") self.setWindowIcon(QtGui.QIcon('ruby.png')) self.setMouseTracking(True) self.m_x = 0 #光标x轴位置 self.m_y = 0 #光标y轴位置 self.stk_info = {} self.stk_info['name'] = '浙江东方' self.stk_info['code'] = '600120' self.stk_info['market'] = 'SH' self.stk_data = {} self.stk_data['list'] = {} #股价序列 self.stk_data['list']['time'] = [] #时间 self.stk_data['list']['open'] = [] #开盘价 self.stk_data['list']['high'] = [] #最高价 self.stk_data['list']['low'] = [] #最低价 self.stk_data['list']['close'] = [] #收盘价 self.stk_data['list']['vol'] = [] #成交量 self.stk_data['list']['amount']= [] #成交额 self.stk_data['list']['mma']= [] #分时均价 self.stk_data['list']['buy_port'] = [(0.00,0),(0.00,0),(0.00,0),(0.00,0),(0.00,0)] #买盘前五 self.stk_data['list']['sell_port'] = [(0.00,0),(0.00,0),(0.00,0),(0.00,0),(0.00,0)] #卖盘前五 #读取数据 f = open('SH600120.txt','r') data = f.readlines() f.close() for row in data: vars = row.split(' ') self.stk_data['list']['time'].append(vars[1]) self.stk_data['list']['open'].append(float(vars[2])) self.stk_data['list']['high'].append(float(vars[3])) self.stk_data['list']['low'].append(float(vars[4])) self.stk_data['list']['close'].append(float(vars[5])) self.stk_data['list']['vol'].append(int(float(vars[6]))) self.stk_data['list']['amount'].append(int(float(vars[7]))) sum_vol = sum(self.stk_data['list']['vol']) sum_amt = sum(self.stk_data['list']['amount']) self.stk_data['list']['mma'].append(float(sum_amt)/(sum_vol*100.00)) self.stk_data['lastclose'] = 10.12 #上一个交易日收盘价 self.stk_data['open'] = self.stk_data['list']['open'][0] #开盘价 self.stk_data['high'] = max(self.stk_data['list']['high']) #最高价 self.stk_data['low'] = min(self.stk_data['list']['low']) #最低价 self.stk_data['close']= self.stk_data['list']['close'][-1] #收盘价 self.stk_data['max_vol'] = max(self.stk_data['list']['vol']) #当日最高成交量 def mouseMoveEvent(self, event): self.m_x = int(event.x()) self.m_y = int(event.y()) self.repaint() def paintEvent(self, event): report_painter(self) app = QtGui.QApplication(sys.argv) dt = Test() dt.show() app.exec_()
还有这个是生造的数据文件:
600120 2011-07-01 8.430 8.480 8.340 8.360 3149769 26493056 600120 2011-07-04 8.410 8.520 8.340 8.510 4516001 38210836 600120 2011-07-05 8.540 8.560 8.410 8.480 7777481 65878192 600120 2011-07-06 8.490 8.490 8.300 8.420 5242033 43893128 600120 2011-07-07 8.440 8.460 8.300 8.400 6127618 51328900 600120 2011-07-08 8.350 8.650 8.310 8.600 9963714 84713360 600120 2011-07-11 8.560 8.740 8.520 8.580 10380010 89564168 600120 2011-07-12 8.500 8.560 8.380 8.410 5574160 46996364 600120 2011-07-13 8.400 8.520 8.390 8.470 4701829 39824976 600120 2011-07-14 8.500 8.690 8.460 8.630 7504610 64556320 600120 2011-07-15 8.630 8.660 8.530 8.620 5705629 48998892 600120 2011-07-18 8.610 8.730 8.560 8.630 5320452 46000688 600120 2011-07-19 8.580 8.600 8.420 8.450 4248058 36036192 600120 2011-07-20 8.510 8.550 8.340 8.420 4750361 40079624 600120 2011-07-21 8.420 8.460 8.320 8.330 3736405 31312912 600120 2011-07-22 8.320 8.390 8.270 8.310 3932585 32756464 600120 2011-07-25 8.290 8.290 7.830 7.850 6353668 51000860 600120 2011-07-26 7.880 8.010 7.860 7.970 3276690 25987310 600120 2011-07-27 8.010 8.330 8.010 8.230 6893659 56675756 600120 2011-07-28 8.140 8.200 7.900 8.080 4816761 38835260 600120 2011-07-29 8.100 8.110 7.900 7.960 3186438 25420588 600120 2011-08-01 7.990 8.070 7.980 8.020 2529614 20283316 600120 2011-08-02 8.000 8.000 7.660 7.740 8525883 66058452 600120 2011-08-03 7.610 7.790 7.590 7.750 3920131 30255948 600120 2011-08-04 7.760 7.900 7.710 7.870 4260037 33309532 600120 2011-08-05 7.550 7.670 7.540 7.600 4065619 31001802 600120 2011-08-08 7.550 7.590 6.840 7.010 5930435 42265528 600120 2011-08-09 6.780 6.900 6.400 6.850 6868576 45893344 600120 2011-08-10 7.000 7.060 6.900 6.950 4487516 31282836 600120 2011-08-11 6.720 7.350 6.690 7.300 6402779 44976020 600120 2011-08-12 7.260 7.820 7.250 7.810 15766826 120297096 600120 2011-08-15 7.810 8.080 7.700 7.850 12323882 97571784 600120 2011-08-16 7.810 8.230 7.800 8.130 10745946 86445416 600120 2011-08-17 8.100 8.380 8.030 8.370 11671606 95696840 600120 2011-08-18 8.360 8.590 8.150 8.190 11869045 98933000 600120 2011-08-19 8.100 8.290 7.870 8.260 6530784 52682404 600120 2011-08-22 8.240 8.510 8.130 8.210 7418123 62068352 600120 2011-08-23 8.300 8.300 7.930 8.080 6113382 49369428 600120 2011-08-24 8.080 8.170 7.800 7.950 6902403 54820380 600120 2011-08-25 7.990 8.000 7.800 7.950 8225919 65140832 600120 2011-08-26 7.980 8.580 7.870 8.390 14188172 117105688 600120 2011-08-29 8.280 8.600 8.200 8.420 12552920 105444392 600120 2011-08-30 8.470 8.650 8.290 8.310 9278734 78914264 600120 2011-08-31 8.390 8.600 8.260 8.470 6950031 58692324 600120 2011-09-01 8.460 8.530 8.120 8.150 6783869 56098000 600120 2011-09-02 8.130 8.150 7.800 7.930 5169247 41035356 600120 2011-09-05 7.900 7.900 7.610 7.770 3367080 25931720 600120 2011-09-06 7.650 7.840 7.630 7.780 1994604 15473853 600120 2011-09-07 7.800 7.920 7.710 7.890 4524852 35365940 600120 2011-09-08 8.000 8.000 7.750 7.780 3260041 25597960 600120 2011-09-09 7.790 7.850 7.690 7.720 1670190 12958421 600120 2011-09-13 7.610 7.610 7.220 7.350 2993141 22118428 600120 2011-09-14 7.410 7.490 7.280 7.460 1601320 11858549 600120 2011-09-15 7.460 7.540 7.380 7.450 1813248 13502755 600120 2011-09-16 7.490 7.570 7.380 7.500 1562320 11709203 600120 2011-09-19 7.380 7.490 7.350 7.350 1256729 9314678 600120 2011-09-20 7.390 7.420 7.070 7.160 4164802 30099376 600120 2011-09-21 7.160 7.350 7.030 7.310 4105156 29545046 600120 2011-09-22 7.240 7.420 7.180 7.190 2778893 20283590 600120 2011-09-23 6.990 7.260 6.930 7.080 3005942 21362102 600120 2011-09-26 7.140 7.280 7.000 7.030 2440617 17473004 600120 2011-09-27 7.100 7.140 6.970 7.050 1876199 13234751 600120 2011-09-28 7.110 7.130 6.850 6.850 1999641 13997734 600120 2011-09-29 6.850 6.850 6.620 6.680 2083164 14028082 600120 2011-09-30 6.800 6.850 6.660 6.810 1446665 9784671 600120 2011-10-10 6.800 7.490 6.800 7.340 6157517 44781964 600120 2011-10-11 7.410 7.550 7.180 7.330 5113073 37712548 600120 2011-10-12 7.330 7.850 7.200 7.650 7080724 53702240 600120 2011-10-13 7.650 7.700 7.480 7.570 3228726 24474174 600120 2011-10-14 7.520 7.830 7.510 7.610 5204745 40001128 600120 2011-10-17 7.530 7.640 7.420 7.470 3093406 23189326 600120 2011-10-18 7.470 7.470 7.240 7.250 2355012 17249810 600120 2011-10-19 7.300 7.350 7.150 7.250 2051058 14839307 600120 2011-10-20 7.200 7.260 6.950 7.040 2177500 15435905 600120 2011-10-21 7.050 7.050 6.850 6.920 1479998 10263274 600120 2011-10-24 6.920 7.050 6.820 7.040 2828763 19645222 600120 2011-10-25 7.090 7.150 6.900 7.110 5454243 38421580 600120 2011-10-26 7.080 7.250 6.980 7.090 7561318 53553768 600120 2011-10-27 7.090 7.110 6.990 7.020 4331955 30494264 600120 2011-10-28 7.080 7.160 7.050 7.130 5397767 38375040 600120 2011-10-31 7.130 7.230 7.120 7.230 4416981 31686934 600120 2011-11-01 7.190 7.240 7.080 7.090 6221598 44541308 600120 2011-11-02 6.970 7.090 6.790 7.070 6240368 43274104 600120 2011-11-03 7.060 7.250 7.060 7.210 7434887 53413296 600120 2011-11-04 7.190 7.310 7.160 7.260 5469346 39634672 600120 2011-11-07 7.230 7.330 7.170 7.280 4881876 35415712 600120 2011-11-08 7.280 7.300 7.030 7.090 5152319 36909572 600120 2011-11-09 7.090 7.140 6.990 7.120 4396667 31023112 600120 2011-11-10 7.010 7.060 6.950 6.980 2874227 20162434 600120 2011-11-11 6.980 7.040 6.940 6.980 1971345 13774011 600120 2011-11-14 7.020 7.220 7.000 7.200 5005408 35833604 600120 2011-11-15 7.170 7.260 7.160 7.220 3018996 21752406 600120 2011-11-16 7.220 7.250 7.000 7.020 3599804 25579700 600120 2011-11-17 7.020 7.090 6.980 7.030 1793379 12631356 600120 2011-11-18 7.000 7.100 6.910 6.930 3106221 21753164 600120 2011-11-21 6.910 6.970 6.800 6.910 1656054 11393588 600120 2011-11-22 6.850 6.900 6.800 6.870 1683639 11521032 600120 2011-11-23 6.870 6.910 6.760 6.790 1465450 10027905 600120 2011-11-24 6.720 6.790 6.650 6.700 1649095 11059988 600120 2011-11-25 6.710 6.750 6.660 6.710 1086150 7282331 600120 2011-11-28 6.750 6.820 6.720 6.800 1174999 7964600 600120 2011-11-29 6.910 6.920 6.780 6.860 1269253 8674397 600120 2011-11-30 6.810 6.860 6.520 6.550 2604110 17315016 600120 2011-12-01 6.690 6.750 6.630 6.680 2671312 17883724 600120 2011-12-02 6.680 6.680 6.450 6.510 1473269 9605086 600120 2011-12-05 6.480 6.480 6.110 6.200 1719220 10751089 600120 2011-12-06 6.170 6.240 6.140 6.210 1223995 7571687 600120 2011-12-07 6.220 6.260 6.180 6.200 961999 5985017 600120 2011-12-08 6.190 6.260 6.110 6.250 1161611 7200791 600120 2011-12-09 6.230 6.240 6.180 6.230 653267 4056483 600120 2011-12-12 6.200 6.240 6.130 6.230 652932 4044556 600120 2011-12-13 6.170 6.200 5.850 6.010 2992541 17886124 600120 2011-12-14 5.970 6.010 5.720 5.950 1722800 10140223 600120 2011-12-15 5.900 6.120 5.640 5.760 3439396 19840406 600120 2011-12-16 5.710 5.810 5.470 5.800 1940713 10971714 600120 2011-12-19 5.760 5.760 5.500 5.690 2164208 12149138 600120 2011-12-20 5.600 5.740 5.600 5.620 1237797 7036752 600120 2011-12-21 5.680 5.710 5.400 5.450 1137091 6378653 600120 2011-12-22 5.360 5.400 5.100 5.230 1565667 8225734 600120 2011-12-23 5.180 5.340 5.180 5.270 1033967 5447228 600120 2011-12-26 5.280 5.310 5.200 5.290 1060186 5591960 600120 2011-12-27 5.250 5.270 5.020 5.100 1373900 7103701 600120 2011-12-28 5.060 5.060 4.830 5.020 1516885 7513323 600120 2011-12-29 5.020 5.060 4.910 4.960 1074220 5366675 600120 2012-01-04 5.090 5.140 4.920 4.930 1904790 9586652 600120 2012-01-05 4.860 4.870 4.680 4.690 1409501 6735327 600120 2012-01-06 5.020 5.100 4.800 4.880 2230808 10954823 600120 2012-01-09 4.890 5.290 4.880 5.260 3338809 16978868 600120 2012-01-10 5.200 5.500 5.150 5.460 3648924 19501378 600120 2012-01-11 5.440 5.440 5.300 5.340 2861417 15362869 600120 2012-01-12 5.340 5.440 5.310 5.350 1763741 9495084 600120 2012-01-13 5.380 5.380 5.100 5.140 2438074 12696630 600120 2012-01-16 5.010 5.170 4.960 4.970 1145104 5807568 600120 2012-01-17 5.000 5.290 4.970 5.290 2698856 14019675 600120 2012-01-18 5.260 5.350 5.180 5.280 2634491 13893458 600120 2012-01-19 5.270 5.350 5.200 5.310 1816398 9624942 600120 2012-01-20 5.330 5.460 5.310 5.430 2573601 13906017 600120 2012-01-30 5.400 5.480 5.340 5.360 1832939 9883418 600120 2012-01-31 5.350 5.390 5.290 5.350 1242594 6630515 600120 2012-02-01 5.370 5.450 5.320 5.320 1841967 9919325 600120 2012-02-02 5.330 5.570 5.330 5.550 4581848 25035066 600120 2012-02-03 5.550 5.650 5.470 5.560 4893311 27319804 600120 2012-02-06 5.530 5.880 5.500 5.750 5100686 29265454 600120 2012-02-07 5.640 5.690 5.590 5.610 3227565 18154338 600120 2012-02-08 5.610 5.790 5.560 5.780 3591428 20524218 600120 2012-02-09 5.730 5.830 5.730 5.760 3408817 19736262 600120 2012-05-10 6.340 6.340 6.340 6.340 514959 3264840 600120 2012-05-14 6.970 6.970 6.970 6.970 931840 6494925 600120 2012-05-15 7.670 7.670 6.760 6.910 27411760 201302192 600120 2012-05-16 6.610 6.790 6.580 6.630 9972930 66460172 600120 2012-05-17 6.600 6.670 6.400 6.490 8248599 53690064 600120 2012-05-18 6.400 6.610 6.320 6.400 5609795 36256556 600120 2012-05-21 6.410 6.520 6.210 6.290 4537627 28691816 600120 2012-05-22 6.340 6.410 6.290 6.370 4063683 25810310 600120 2012-05-23 6.370 6.450 6.180 6.250 4498954 28159672 600120 2012-05-24 6.270 6.380 6.200 6.350 4195454 26358802 600120 2012-05-25 6.320 6.480 6.230 6.360 6258612 39857576 600120 2012-05-28 6.320 6.400 6.190 6.400 4998941 31474214 600120 2012-05-29 6.400 6.530 6.360 6.440 5729309 37068284 600120 2012-05-30 6.460 6.460 6.350 6.370 3101571 19816940 600120 2012-05-31 6.300 6.350 6.230 6.240 3738985 23467144 600120 2012-06-01 6.210 6.280 6.080 6.110 4507252 27767424 600120 2012-06-04 6.000 6.010 5.840 5.860 3086545 18299630 600120 2012-06-05 5.870 5.960 5.860 5.930 1942942 11496336 600120 2012-06-06 5.960 5.960 5.600 5.760 2998969 17440282 600120 2012-06-07 5.780 5.960 5.770 5.790 2594537 15175500 600120 2012-06-08 5.830 5.880 5.700 5.750 1808774 10501804 600120 2012-06-11 5.800 5.850 5.730 5.830 1861236 10775968 600120 2012-06-12 5.850 5.930 5.800 5.850 2007190 11774889 600120 2012-06-13 5.860 6.130 5.790 6.100 5304235 31868112 600120 2012-06-14 6.050 6.090 5.910 5.930 3202802 19241666 600120 2012-06-15 5.930 5.970 5.810 5.900 1774010 10459891 600120 2012-06-18 5.900 5.990 5.870 5.880 2001440 11862747 600120 2012-06-19 5.880 5.950 5.820 5.830 1968435 11601531 600120 2012-06-20 5.840 5.980 5.810 5.950 2428144 14288923 600120 2012-06-21 5.910 5.910 5.700 5.760 1990001 11558386 600120 2012-06-26 5.530 5.590 5.400 5.480 2086008 11426576 600120 2012-06-27 5.470 5.580 5.450 5.450 1080842 5962850 600120 2012-06-28 5.510 5.520 5.260 5.280 1549881 8344252 600120 2012-06-29 5.250 5.350 5.180 5.330 1597134 8426737 600120 2012-07-02 5.400 5.410 5.320 5.350 1118989 5986785 600120 2012-07-03 5.370 5.430 5.310 5.400 1379692 7439132 600120 2012-07-04 5.400 5.470 5.380 5.410 1395455 7563382 600120 2012-07-05 5.410 5.410 5.280 5.360 1534313 8190450 600120 2012-07-06 5.400 5.520 5.320 5.400 2657751 14387281 600120 2012-07-09 5.400 5.490 5.320 5.330 2448854 13205528 600120 2012-07-10 5.350 5.860 5.340 5.860 7802024 45076920 600120 2012-07-11 6.110 6.330 6.060 6.240 22276192 137748160 600120 2012-07-12 6.130 6.330 6.030 6.320 16639952 103002552 600120 2012-07-13 6.250 6.890 6.170 6.610 19638960 127671288 600120 2012-07-16 6.500 6.750 6.410 6.490 15513604 102224928 600120 2012-07-17 6.360 6.950 6.260 6.820 18767700 124877352 600120 2012-07-18 6.720 7.000 6.560 6.800 18327382 124799976 600120 2012-07-19 6.700 6.860 6.550 6.680 15164894 101237520 600120 2012-07-20 6.550 6.630 6.380 6.440 9728719 63227360 600120 2012-07-23 6.330 6.370 6.160 6.320 7001618 44002316 600120 2012-07-24 6.270 6.450 6.220 6.340 6881987 43810260 600120 2012-07-25 6.250 6.660 6.210 6.500 12923801 83741672 600120 2012-07-26 6.450 6.550 6.150 6.200 7061937 44964776 600120 2012-07-27 6.410 6.420 6.110 6.230 5700987 35619536 600120 2012-07-30 6.170 6.240 5.610 5.610 8543043 49370452 600120 2012-07-31 5.600 5.940 5.480 5.710 7669121 44260340 600120 2012-08-01 5.620 5.830 5.550 5.720 4405627 25176060 600120 2012-08-02 5.730 5.970 5.680 5.890 7018821 41113080 600120 2012-08-03 5.850 5.940 5.830 5.930 3797656 22333222 600120 2012-08-06 5.930 6.050 5.820 6.010 5291014 31587280 600120 2012-08-07 6.010 6.330 6.000 6.190 8028181 49717732 600120 2012-08-08 6.220 6.220 6.060 6.140 4085520 24994584 600120 2012-08-09 6.100 6.120 5.810 6.120 8067361 48357004 600120 2012-08-10 6.050 6.190 6.010 6.060 4016290 24371520 600120 2012-08-13 6.200 6.670 6.200 6.330 15222520 97680776 600120 2012-08-14 6.500 6.900 6.350 6.680 17682586 117190552 600120 2012-08-15 6.690 6.690 6.330 6.390 10266937 66058708 600120 2012-08-16 6.400 6.660 6.150 6.160 9145371 58658368 600120 2012-08-17 6.120 6.160 5.940 6.100 6471054 39053048 600120 2012-08-20 6.100 6.290 5.980 6.270 5655946 34765680 600120 2012-08-21 6.150 6.300 6.120 6.230 6037340 37561272 600120 2012-08-22 6.230 6.230 6.000 6.050 5329714 32457810 600120 2012-08-23 5.940 6.140 5.940 6.090 3759488 22779714 600120 2012-08-24 6.150 6.290 6.050 6.080 6970082 42997304 600120 2012-08-27 6.050 6.050 5.720 5.850 4477758 26282412 600120 2012-08-28 5.860 5.930 5.770 5.900 2470654 14475564 600120 2012-08-29 5.900 5.900 5.750 5.750 3104898 17997202 600120 2012-08-30 5.690 5.850 5.590 5.670 2875641 16442648 600120 2012-08-31 5.670 5.780 5.600 5.750 1848001 10556758 600120 2012-09-03 5.740 5.930 5.680 5.900 3951762 23129270 600120 2012-09-04 5.920 5.920 5.690 5.700 3707201 21481764 600120 2012-09-05 5.690 5.750 5.620 5.720 2782154 15832339 600120 2012-09-06 5.750 5.780 5.640 5.690 2869553 16314120 600120 2012-09-07 5.760 5.970 5.700 5.890 5783402 33932288 600120 2012-09-10 5.890 6.080 5.860 6.060 6170653 37105776 600120 2012-09-11 6.040 6.060 5.910 6.060 3652909 21851064 600120 2012-09-12 6.100 6.130 6.020 6.060 3930014 23842410 600120 2012-09-13 6.080 6.100 5.910 5.910 2957667 17805100 600120 2012-09-14 5.920 6.000 5.830 5.890 2792995 16490332 600120 2012-09-17 5.820 5.890 5.640 5.640 2734759 15720210 600120 2012-09-18 5.640 5.760 5.610 5.650 1748883 9932194 600120 2012-09-19 5.680 5.780 5.680 5.740 1306841 7485999 600120 2012-09-20 5.740 5.740 5.380 5.450 2683344 14859092 600120 2012-09-21 5.440 5.470 5.300 5.430 1612603 8708786 600120 2012-09-24 5.450 5.510 5.380 5.480 1343010 7340127 600120 2012-09-25 5.480 5.490 5.340 5.380 1247570 6757381 600120 2012-09-26 5.360 5.440 5.130 5.180 1431045 7528501 600120 2012-09-27 5.170 5.330 5.140 5.260 1763023 9279980 600120 2012-09-28 5.200 5.360 5.200 5.340 2006394 10612739 600120 2012-10-08 5.360 5.560 5.350 5.460 3435758 18897262 600120 2012-10-09 5.460 5.550 5.450 5.550 2209764 12187114 600120 2012-10-10 5.540 5.580 5.480 5.570 1898232 10539406 600120 2012-10-11 5.550 5.570 5.410 5.460 1873838 10315861 600120 2012-10-12 5.460 5.490 5.360 5.460 1619960 8811500 600120 2012-10-15 5.480 5.480 5.330 5.360 1355799 7280243 600120 2012-10-16 5.390 5.430 5.330 5.430 1427428 7711129 600120 2012-10-17 5.440 5.500 5.400 5.480 1262048 6901247 600120 2012-10-18 5.450 5.560 5.450 5.540 1938503 10716095 600120 2012-10-19 5.500 5.560 5.500 5.550 1629063 9013752 600120 2012-10-22 5.500 5.540 5.460 5.540 1523985 8396867 600120 2012-10-23 5.520 5.550 5.470 5.470 1517978 8364718 600120 2012-10-24 5.480 5.640 5.480 5.620 4318489 24147084 600120 2012-10-25 5.600 5.620 5.460 5.510 2332800 12935266 600120 2012-10-26 5.500 5.520 5.300 5.320 1968179 10570681 600120 2012-10-29 5.300 5.350 5.240 5.280 1184547 6253799 600120 2012-10-30 5.280 5.370 5.270 5.350 861803 4588509 600120 2012-10-31 5.370 5.370 5.240 5.290 1023519 5407486 600120 2012-11-01 5.300 5.420 5.280 5.410 1483984 7962948 600120 2012-11-02 5.410 5.440 5.360 5.440 1308161 7073081 600120 2012-11-05 5.450 5.530 5.400 5.500 2027746 11118383 600120 2012-11-06 5.500 5.500 5.370 5.450 1314405 7139731 600120 2012-11-07 5.360 5.370 5.160 5.270 4737230 24837488 600120 2012-11-08 5.200 5.240 5.140 5.150 2036601 10567178 600120 2012-11-09 5.130 5.220 5.120 5.200 1307604 6757081 600120 2012-11-12 5.200 5.380 5.070 5.360 4254705 22151888 600120 2012-11-13 5.700 5.900 5.530 5.530 15434146 88320960 600120 2012-11-14 5.390 5.430 5.150 5.210 8091713 42871408 600120 2012-11-15 5.200 5.320 5.150 5.180 3814789 19947090 600120 2012-11-16 5.160 5.180 5.000 5.090 3265990 16524752 600120 2012-11-19 5.090 5.140 5.010 5.100 2257164 11403216 600120 2012-11-20 5.100 5.140 5.030 5.030 1571279 7984035 600120 2012-11-21 5.000 5.060 4.880 5.050 3050816 15147326 600120 2012-11-22 5.000 5.020 4.920 4.950 1788547 8869217 600120 2012-11-23 4.960 5.020 4.940 4.960 1372151 6832961 600120 2012-11-26 4.980 4.990 4.880 4.880 1137756 5597685 600120 2012-11-27 4.860 4.950 4.700 4.740 1689649 8158868 600120 2012-11-28 4.740 4.740 4.520 4.590 1284289 5941912 600120 2012-11-29 4.590 4.640 4.480 4.490 969922 4423860 600120 2012-11-30 4.450 4.560 4.450 4.520 1235100 5569609 600120 2012-12-03 4.520 4.550 4.310 4.320 1379623 6147945 600120 2012-12-04 4.320 4.410 4.230 4.380 1667153 7171231 600120 2012-12-05 4.360 4.580 4.360 4.580 2422869 10954693 600120 2012-12-06 4.580 4.620 4.500 4.540 1407798 6396522 600120 2012-12-07 4.510 4.700 4.510 4.680 2462421 11472038 600120 2012-12-10 4.680 4.880 4.680 4.830 3202908 15354105 600120 2012-12-11 4.830 4.910 4.740 4.740 3257935 15748287 600120 2012-12-12 4.740 4.780 4.650 4.730 2110366 9952871 600120 2012-12-13 4.700 4.800 4.650 4.720 2028066 9630472 600120 2012-12-14 4.680 4.930 4.680 4.890 4415891 21475120 600120 2012-12-17 4.870 5.090 4.870 4.940 5758027 28685946 600120 2012-12-18 4.910 5.030 4.900 4.920 3205939 15937582 600120 2012-12-19 4.950 4.970 4.890 4.940 1970912 9721340 600120 2012-12-20 4.910 4.970 4.860 4.960 2776664 13648103 600120 2012-12-21 5.000 5.020 4.930 4.940 2582680 12835924 600120 2012-12-24 4.900 4.990 4.900 4.950 1395443 6916473 600120 2012-12-25 4.910 5.040 4.910 5.030 3671653 18358908 600120 2012-12-26 5.030 5.080 4.990 5.070 3383588 17015576 600120 2012-12-27 5.050 5.100 5.020 5.030 3100081 15631201 600120 2012-12-28 5.020 5.050 5.000 5.040 3738248 18785418 600120 2012-12-31 5.050 5.210 5.020 5.180 5492425 28178540 600120 2013-01-04 5.180 5.250 5.040 5.160 4505342 23113802 600120 2013-01-07 5.140 5.240 5.100 5.230 3740693 19357138 600120 2013-01-08 5.230 5.250 5.160 5.230 3428131 17831330 600120 2013-01-09 5.750 5.750 5.620 5.750 15137964 86851376 600120 2013-01-10 5.890 5.890 5.590 5.680 19259634 109951720 600120 2013-01-11 5.710 6.190 5.600 5.830 17767632 104686280 600120 2013-01-14 5.700 6.140 5.690 6.080 17128604 103055384 600120 2013-01-15 6.050 6.110 5.950 6.080 11690986 70449808 600120 2013-01-16 6.060 6.060 5.810 5.940 9519043 56312520 600120 2013-01-17 5.940 5.940 5.760 5.820 5490334 31996616 600120 2013-01-18 5.840 5.910 5.800 5.870 4441257 26049472 600120 2013-01-21 5.900 5.950 5.830 5.950 4949409 29187012 600120 2013-01-22 5.920 5.960 5.800 5.890 5524068 32470218 600120 2013-01-23 5.890 5.920 5.670 5.760 5285930 30515522 600120 2013-01-24 5.830 5.990 5.700 5.810 8746975 51253216 600120 2013-01-25 5.710 5.780 5.670 5.690 2938357 16774085 600120 2013-01-28 5.720 5.920 5.720 5.920 5615520 32894768 600120 2013-01-29 5.920 6.030 5.870 5.970 7778448 46530040 600120 2013-01-30 5.970 6.170 5.970 6.050 7974663 48414056 600120 2013-01-31 6.450 6.660 6.250 6.330 20167094 129655856 600120 2013-02-01 6.330 6.850 6.260 6.480 15610902 102880336 600120 2013-02-04 6.330 6.330 6.080 6.130 11360102 70013160 600120 2013-02-05 6.030 6.160 6.020 6.140 4903472 29867632 600120 2013-02-06 6.170 6.230 6.120 6.170 3826076 23581090 600120 2013-02-07 6.140 6.220 6.130 6.180 3255472 20093372 600120 2013-02-08 6.200 6.260 6.180 6.190 4681355 29087642 600120 2013-02-18 6.280 6.310 6.200 6.260 4845549 30340608 600120 2013-02-19 6.250 6.320 6.100 6.130 4727252 29183232 600120 2013-02-20 6.170 6.300 6.130 6.300 5596862 34757520 600120 2013-02-21 6.260 6.490 6.200 6.440 12809449 81299392 600120 2013-02-22 6.410 6.510 6.270 6.290 7584128 48492400 600120 2013-02-25 6.280 6.330 6.160 6.310 5220263 32598266 600120 2013-02-26 6.320 6.420 6.220 6.240 6156654 38917012 600120 2013-02-27 6.210 6.320 6.190 6.240 4068847 25377816 600120 2013-02-28 6.270 6.410 6.220 6.370 7447814 47241996 600120 2013-03-01 6.360 6.610 6.260 6.610 14957895 96688696 600120 2013-03-04 6.520 6.780 6.440 6.550 13564858 89516888 600120 2013-03-05 6.500 6.800 6.500 6.720 11519010 76836992 600120 2013-03-06 6.920 7.390 6.800 7.390 26849848 189968432 600120 2013-03-07 7.780 8.130 7.670 8.030 40965844 322816768 600120 2013-03-08 7.950 8.220 7.730 7.790 28627918 228489488 600120 2013-03-11 7.870 7.870 7.180 7.530 18937636 141743744 600120 2013-03-12 7.450 7.620 7.170 7.480 15535111 115027416 600120 2013-03-13 7.410 7.540 7.230 7.420 10559835 78049992 600120 2013-03-14 7.350 7.630 7.340 7.450 11297736 84727264 600120 2013-03-15 7.490 7.710 7.310 7.540 14645334 110597144 600120 2013-03-18 7.400 7.400 6.900 7.010 13872665 98271352 600120 2013-03-19 6.980 7.150 6.770 6.910 10347213 71593536 600120 2013-03-20 6.940 7.260 6.850 7.200 11781630 83496264 600120 2013-03-21 7.150 7.520 7.150 7.490 12763050 94041384 600120 2013-03-22 7.420 7.670 7.280 7.570 13966066 104551368 600120 2013-03-25 7.750 7.990 7.610 7.630 15983236 124691712 600120 2013-03-26 7.630 8.390 7.600 8.380 26428312 211724464 600120 2013-03-27 8.250 8.540 8.090 8.260 24350716 202126576 600120 2013-03-28 8.170 8.770 7.890 8.500 34068656 286435744 600120 2013-03-29 8.370 8.600 8.240 8.240 14159268 118628944 600120 2013-04-01 8.310 8.740 8.280 8.500 17816092 152612272 600120 2013-04-02 8.690 8.700 7.810 8.000 18838794 156627616 600120 2013-04-03 7.990 8.200 7.800 7.920 11452403 91542184 600120 2013-04-08 7.730 8.550 7.560 8.470 13963396 113644160 600120 2013-04-09 8.540 8.970 8.460 8.840 18834228 165475248 600120 2013-04-10 8.790 8.870 8.630 8.770 10376445 90857848 600120 2013-04-11 8.770 8.850 8.560 8.610 8377727 72409424 600120 2013-04-12 8.720 9.080 8.720 8.890 19480370 173966848 600120 2013-04-15 8.910 8.980 8.620 8.630 10265764 89914552 600120 2013-04-16 8.480 8.930 8.190 8.840 13336577 114974256 600120 2013-04-17 8.790 9.040 8.630 8.940 11676056 103827328 600120 2013-04-18 8.860 9.280 8.800 9.080 11847024 107250600 600120 2013-04-19 9.100 9.990 8.980 9.790 33011634 318405920
---- 再次鸣谢 散漫 童鞋的热心。
---- 我在用 matplotlib 的时候有接触过 PyQT 和 wxPython 的概念,另外昨天也稍微股沟了一下。它们之间的关系: matplotlib 是前端,PyQT 或 wxPython 是后端。或者说 matplotlib 相当于 Python,而 PyQT 和 wxPython 相当于 C。
*. 实际用的时候,可以用 matplotlib 绘图,也可以直接用 PyQT 绘图,也可以用 PyQT 做一个 GUI 然后在后台调用 matplotlib 绘图,取舍的考虑也跟 Python 和 C 很像:PyQT 快些,但都是些底层的特性。matplotlib 用起来方便,但速度就不那么可观,只适合做一些不要求实时性的静态任务。
*. 用 matplotlib 绘图的时候可以指定使用哪种后台,比如这个:
import matplotlib # 这个要紧跟在 import matplotlib 之后,而且必须安装了 wxpython 2.8 才行。 matplotlib.use("WXAgg", warn=True)
这个就是指定后台使用 wxPython,当然必须先安装了这个组件才行。
*. matplotlib 代码里可以直接使用 PyQT 等后端的特性,比如捕捉鼠标点击事件,等等。
---- 另外,有一位 伊莱·班德斯基 童鞋(看文章是个大牛)演示了怎样把 PyQT 和 matplotlib 整合在一起,用 PyQT 写图形界面,在后台调用 matplotlib 绘图:
http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/
---- 最后说明下,PyQT 只有 GPL 授权和商业授权可选。无论屌丝拿它开发了什么唯我独尊的牛B项目,只要还 买不起 不想购买商业许可,那只能门户开放,大家利益均沾。
2013年5月18日 23:53
有 PySide 的喵~
2013年5月19日 00:03
@依云: 矮油,这个好!屌丝救星 ~ :)
2013年5月26日 11:32
看了你用的博客受益匪浅,请教一下,用python画出图后,能查看每根K线的具体价格么?谢了!
2013年5月26日 16:37
@dearsa: matplotlib 和 pyqt 都可以做到,但是我写的代码里不能。
2021年8月03日 19:34
Your family-owned clean-up company will likely be happy and pleased to provide the whole range connected with services geared to all your family needs. We have ages of practical knowledge in giving professional every day and company cleaning through out London. Our eager and trusted team will supply you excessive standard services because first stop by. We deliver End connected with Tenancy Clean-up, After General contractors Cleaning, Soon after Party Clean-up, One down deep clean-up, Carpet, Mattresses and Upholstery Clean-up, Office, Classes and Room, Shop Clean-up. cleaning company dubai
2021年8月22日 16:25
ฉันได้ประโยชน์มากมายจากการอ่านบล็อกที่คุณใช้ กรุณาถาม ฉันสามารถเช็คราคาเฉพาะของ K-line แต่ละเส้นหลังจากวาดรูปด้วย python ได้หรือไม่? ขอบคุณ!
https://www.superslot.bz here my website
2021年8月22日 16:26
<a href="https://superslot.bz">here is my website</a>
2022年9月03日 18:05
Haryana Board Model Paper 2023 Class 4 Pdf Download with Answers for English Medium, Hindi Medium, Urdu Medium & Students for Small Answers, Long Answer, Very Long Answer Questions, and Essay Type Questions to Term1 & Term2 Exams at official website. HBSE Question Paper Class 4 New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.