例如這樣
#下標效果
plt.xlabel('RR$_{n}$ (ms)', fontsize=20)
#上標效果
plt.ylabel('RR$^{n+1}$ (ms)', fontsize=20)
結果
ref:
http://blog.sina.com.cn/s/blog_4a7b9abb0102x27h.html
其他特殊符號
https://matplotlib.org/users/mathtext.html
from comtypes.client import GetModule, GetEvents, CreateObject
GetModule('C:\\SKCOM\\CapitalAPI_2.13.13\\x64\\SKCOM.dll')
import comtypes.gen.SKCOMLib as sk
skC = CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib)
skO = CreateObject(sk.SKOrderLib, interface=sk.ISKOrderLib)
#使用jupyter notebook magic function,這句可以讓 Event Pump 出來
%matplotlib auto
ID=''
PW=''
#建立事件類別
class skO_events:
def __init__(self):
#初始化,可以設定一些變數供使用
self.Acc=''
self.Balance=[]
def OnBalanceQuery(self, bstrData):
#將Balance 回傳資訊存在 event instance 的 Balance 屬性中
self.Balance.append(bstrData)
print('OnBalanceQuery', bstrData)
def OnMarginPurchaseAmountLimit(self, bstrData):
print('OnMargin', bstrData)
def OnAccount(self, LogInID, AccountData):
if AccountData.split(',')[0]=='TS':
self.Acc=AccountData.split(',')[2] + AccountData.split(',')[3]
print(LogInID, AccountData)
EventO=skO_events()
EventO_handler=GetEvents(skO, EventO)
#Login
skC.SKCenterLib_Login(ID,PW)
#Order object initialize
skO.SKORderLib_Initialize()
skO.GetUserAccount()
skO.GetBalanceQuery(ID, EventO.Acc, '')
#查看 Balance
print(EventO.Balance)
skO.GetMarginPurchaseAmountLimit(ID, '', '')
import wx, time import comtypes.client as cc cc.GetModule('C:\\SKCOM\\2.13.9\\x86\\SKCOM.dll') import comtypes.gen.SKCOMLib as sk #Event class class skQ_events: def __init__(self): tc1.write('skQ event class created'+ '\n') def OnConnection(self, nKind, nCode): tc1.write('SKQ_OnConnection, ' + 'nKind= ' + str(nKind) + ', nCode= ' + str(nCode) + '\n') def OnNotifyQuote(self, sMarketNo, sStockIdx): getStock(sMarketNo, sStockIdx, ts) class skR_events: def __init__(self): tc1.write('skR event class created' + '\n') def OnConnect(self, bstrUserID, bstrData): tc1.write(str(bstrUserID) + ", skR_OnConnect" + '\n') def OnComplete(self, bstrUserID): tc1.write('skR OnCompleted' + '\n') def OnSolaceReplyConnection(self, bstrUserID, nErrorCode): tc1.write('skR OnSolaceReplyConnection, ' + str(bstrUserID) + ', nErrorCode= '+ str(nErrorCode) + '\n') #custom functions def getStock(nMarket, nIndex, ts): nCode=skQ.SKQuoteLib_GetStockByIndex(nMarket, nIndex, ts) tc2.write(str(ts.bstrStockNo) + ' ' + str(ts.nClose/10**ts.sDecimal) + '\n') #GUI class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() self.CreatSKCOMObject() self.CreatSKCOMEvent() def InitUI(self): pnl = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) hbox2 = wx.BoxSizer(wx.HORIZONTAL) hbox3 = wx.BoxSizer(wx.HORIZONTAL) #labels st1 = wx.StaticText(pnl, label='ID ') st2 = wx.StaticText(pnl, label='PW ') st3 = wx.StaticText(pnl, label='Quote') #text input self.tcID = wx.TextCtrl(pnl, size=(80, -1)) self.tcPW = wx.TextCtrl(pnl, size=(80, -1), style=wx.TE_PASSWORD) self.tcQuery = wx.TextCtrl(pnl, size=(80, -1), value="TX00") global tc1, tc2 tc1 = wx.TextCtrl(pnl, style=wx.TE_MULTILINE) tc2 = wx.TextCtrl(pnl, style=wx.TE_MULTILINE) self.bt_login = wx.Button(pnl, label='1. Login') self.bt_connect = wx.Button(pnl, label='2. Connect') self.bt_request = wx.Button(pnl, label='3. Request') #layout hbox1.Add(st1, flag=wx.LEFT, border=10) hbox1.Add(self.tcID, flag=wx.LEFT, border=35) hbox1.Add(self.bt_login, flag=wx.LEFT, border=35) hbox1.Add(self.bt_connect, flag=wx.LEFT, border=35) hbox2.Add(st2, flag=wx.LEFT, border=10) hbox2.Add(self.tcPW, flag=wx.LEFT, border=35) hbox3.Add(st3, flag=wx.LEFT, border=10) hbox3.Add(self.tcQuery, flag=wx.LEFT, border=35) hbox3.Add(self.bt_request, flag=wx.LEFT, border=35) vbox.Add(hbox1, flag=wx.TOP, border=10) vbox.Add(hbox2, flag=wx.TOP, border=10) vbox.Add(hbox3, flag=wx.TOP, border=10) vbox.Add(tc1, proportion=1, flag=wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border=15) vbox.Add(tc2, proportion=1, flag=wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border=15) #Set event handlers self.Bind(wx.EVT_BUTTON, self.OnLogin, self.bt_login) self.Bind(wx.EVT_BUTTON, self.OnConnect, self.bt_connect) self.Bind(wx.EVT_BUTTON, self.OnRequest, self.bt_request) pnl.SetSizer(vbox) self.SetSize((400,600)) self.SetTitle('pySKCOMtester') self.Centre() self.Show(True) def CreatSKCOMObject(self): global ts, skC, skQ, skR #股票物件 ts=sk.SKSTOCK() #SKCOM object skC=cc.CreateObject(sk.SKCenterLib,interface=sk.ISKCenterLib) skQ=cc.CreateObject(sk.SKQuoteLib,interface=sk.ISKQuoteLib) skR=cc.CreateObject(sk.SKReplyLib,interface=sk.ISKReplyLib) def CreatSKCOMEvent(self): global EveQ, EveR, ConQ, ConR #instant of event sinks EveQ=skQ_events() EveR=skR_events() #make connection to event sink ConQ = cc.GetEvents(skQ, EveQ) ConR = cc.GetEvents(skR, EveR) #Callback def OnLogin(self, e): ID=self.tcID.GetValue() PW=self.tcPW.GetValue() nCode=skC.SKCenterLib_Login( ID, PW) tc1.write('Login, nCode= ' + str(nCode) + '\n') nCode=skR.SKReplyLib_ConnectByID(ID) tc1.write('skR Connected, nCode= ' + str(nCode) + '\n') e.Skip() def OnConnect(self, e): nCode=skQ.SKQuoteLib_EnterMonitor() tc1.write('skQ EnterMonitor, nCode= ' + str(nCode) + '\n') def OnRequest(self, e): Stocks=self.tcQuery.GetValue() nCode=skQ.SKQuoteLib_RequestStocks(1, Stocks) tc1.write('skQ RequestStocks ' + Stocks + ', nCode= ' + str(nCode[1])+ '\n') e.Skip() def main(): ex = wx.App() Example(None) ex.MainLoop() if __name__ == '__main__': main()